2015-01-23 4 views
0

У меня есть два пользовательских NSObjects, которые ссылаются друг на друг, как показано ниже:цель с циклической ссылкой

.h файл класс 1

#import <Foundation/Foundation.h> 
#import "MyChildClass.h" 

@interface MyParentClass : NSObject 

@property (nonatomic, strong) NSString *Name; 
@property (nonatomic) MyChildClass *myChild; 

@end 

.m файл класс 1:

#import "MyParentClass.h" 

@implementation MyParentClass 

@end 

и ...

.h файл класс 2:

#import <Foundation/Foundation.h> 
#import "MyParentClass.h" 

@interface MyChildClass : NSObject 

@property (nonatomic) MyParentClass *myParent; 

@end 

.m файл класс 2:

#import "MyChildClass.h" 

@implementation MyChildClass 

@end 

Когда я пытаюсь реализовать те, как показано ниже, проект не будет строить, с ошибкой " Ограничения Arc: Неявное преобразование указателя Objective-C в 'int *' не разрешено с помощью ARC "

Просмотреть Код реализации контроллера:

MyParentClass *newParent = [[MyParentClass alloc] init]; 
    MyChildClass *newChild = [[MyChildClass alloc] init]; 

    newParent.Name = @"Johnny"; 
    newParent.myChild = newChild; 

    newChild.myParent = newParent; 

Однако, когда я вкладываю второй пример на отдельные .h/.m файлы, проект будет строить:

вложенной .h файл:

#import <Foundation/Foundation.h> 

@class MyNestedClass; 

@interface MyChildNestedClass : NSObject 

@property (nonatomic, strong) MyNestedClass *myNested; 
@property (nonatomic, strong) NSString *ChildName; 

@end 

@interface MyNestedClass : NSObject 

@property (nonatomic, strong) MyChildNestedClass *myChild; 
@property (nonatomic, strong) NSString *ParentName; 

@end 

вложенного. м файл:

#import "MyNestedClass.h" 

@implementation MyChildNestedClass 

@end 

@implementation MyNestedClass 

@end 

I gue ss, что, вложив объекты в один файл, я каким-то образом обманываю ARC, и я действительно не должен создавать эти циклические ссылки.

Может ли кто-нибудь предложить правильный способ вложенности таких типов?

То, что я пытаюсь достичь, является следующим псевдо-сценарием: у родителя есть свойство Ребенка. У ребенка есть свойство родителя, это ребенок.

Я нахожу это трудным, потому что я не должен это делать (круговые ссылки), или я пропускаю что-то очевидное?

Большое спасибо!

+0

FYI - Вы должны быть уверены, что ребенка ссылка на его родительскую ссылку является «слабым». В противном случае у вас есть некоторые нежелательные ссылочные циклы. – rmaddy

ответ

4

Не #import "MyChildClass.h" в файле заголовка родительского класса, измените его на

@class MyChildClass 

и добавьте #import в исходном файле (.m)

+0

Ничего .h должен импортировать другой .h. Оба должны использовать форвардные декларации. – rmaddy

Смежные вопросы