gpt4 book ai didi

iphone - Objective-C 自定义属性 getter 无限递归

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:05:04 25 4
gpt4 key购买 nike

我有一个实现数据树节点的 Objective-C 类。它的属性对公众是只读的,而该类的私有(private)扩展(此处未显示)实现了属性的 setter ,因此管理器类可以创建树。

// 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;

我想为其中一个属性实现一个自定义 getter,如果该属性为 nil,它将沿着树向上走,直到它找到一个具有该属性非 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;
}

我搜索过这个论坛和其他论坛,但没有找到我在这里尝试做的事情的任何例子。有人有什么建议吗?

此外, setter/getter 中的最后一行应该是

return [result copy];

?

最佳答案

嗯,我想你想要这样的东西:

-(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;
}

嗯,实际上看到你有一个包含一些纹理数据的 data 变量,它可以像这样完成:

-(NSString *) data {
// If data is nil, ask parent instance for a value, otherwise return a copy.
return data == nil ? [parent data] : [data copy];
}

所以DataSet的每个实例都不需要有一个循环。他们所做的只是与他们的直系 parent 核实。这样,如果您有 A -> B -> C -> D 的数据图并执行 [D data]; D 将检查自身,然后作为 C,C 将检查自身,然后作为B,它会检查自己然后询问 A。你会得到第一个成功的非 nil 值的结果。

关于iphone - Objective-C 自定义属性 getter 无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6448565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com