У меня есть класс Objective-C, который реализует узел для дерева данных.Его свойства доступны только для чтения, в то время как закрытое расширение класса (здесь не показано) реализует установщики свойств, чтобы класс менеджера мог создать дерево.
// Interface
@interface DataSet : NSObject {
NSString *name;
NSString *data;
@private
DataSet *parent;
NSMutableArray *children;
}
@property (nonatomic, readonly, copy) NSString *name;
@property (nonatomic, readonly, copy) NSString *data;
Я хочу реализовать собственный метод получения для одного из свойств, которое, если свойство имеет значение nil, будет проходить вверх по дереву, пока не найдет узел-предок, который имеет значение, отличное от nil для этого свойства.,
Моя проблема заключается в реализации метода получения без бесконечной рекурсии вызова самого метода получения.
// Implementation
@interface DataSet ()
@property (nonatomic, retain) DataSet *parent;
@property (nonatomic, retain) NSMutableArray *children;
@end
@implementation DataSet
@synthesize name;
// do not @synthesize data
@synthesize parent, children;
// custom getter walks up tree to find first non-nil 'data' property
- (NSString*) data {
NSString *result = nil;
DataSet *set = self;
while (set != nil && result == nil) {
result = [set data]; // <=== INFINITE RECURSION HERE
set = set.parent;
}
return result;
}
Я просматривал этот и другие форумы, но не нашел примеров того, что я пытаюсь сделать здесь.У кого-нибудь есть какие-либо предложения?
Кроме того, должна ли последняя строка в получателе быть
return [result copy];
?