Ste*_*ine 2 iphone objective-c ipad ios
我有一个Objective-C类,它实现了数据树的节点.它的属性对公众是只读的,而类的私有扩展(这里未显示)实现了属性的setter,因此manager类可以创建树.
// 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;
Run Code Online (Sandbox Code Playgroud)
我想为其中一个属性实现一个自定义getter,如果属性为nil,它将向上走,直到找到一个祖先节点,该节点具有该属性的非零值.
我的问题是实现getter而不会导致getter调用自身的无限递归.
// 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;
}
Run Code Online (Sandbox Code Playgroud)
我已经搜索了这个和其他论坛,但没有找到任何我想在这里做的例子.有人有什么建议吗?
另外,应该是getter中的最后一行
return [result copy];
Run Code Online (Sandbox Code Playgroud)
?
嗯,我想你想要这样的东西:
-(NSString *) data {
// Determine result from current instance data.
NSString *result = ....;
// If nothing, ask parent instance of this instance.
if (result == nil) {
result = [parent data];
}
// Might still be nil if parent returns nothing.
return result;
}
Run Code Online (Sandbox Code Playgroud)
嗯,实际上看到你有一个data
包含一些纹理数据的变量,它可以这样做:
-(NSString *) data {
// If data is nil, ask parent instance for a value, otherwise return a copy.
return data == nil ? [parent data] : [data copy];
}
Run Code Online (Sandbox Code Playgroud)
因此,DataSet的每个实例都不需要循环.他们所做的只是与他们的直接父母一起检查.这样,如果你有一个A - > B - > C - > D的数据图并且执行[D data];
D将检查自己然后作为C,它将检查自己然后作为B,它将检查自己然后问A.你将获得结果的第一个成功的非零值.
归档时间: |
|
查看次数: |
1890 次 |
最近记录: |