データツリーのノードを実装するObjective-Cクラスがあります。クラスのプライベートエクステンション(ここでは示されていません)は、プロパティーのセッターを実装しているので、マネージャークラスはツリーを作成できます。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;
}
私はこのフォーラムや他のフォーラムで検索しましたが、ここで何をしようとしているのかの例は見つかりませんでした。誰でも何か提案がありますか?
また、ゲッターの最後の行は
すべきですか?
これはうまくいくでしょうが、Objective-Cメッセージを送るwhileループの1つのメッセージは、通常のC関数呼び出しよりも少しオーバーヘッドがあります(ダイナミックディスパッチとは何か?)。 –
私はJavaからObjective Cへと移行しています。そのため、ルーピングの方が速いかもしれませんが、私はObjective Cを個人的に見ています。もちろん、多くの呼び出しに起因する実際の速度の問題がありました。 :-) – drekka
このアプローチのもう1つの利点は、ツリー内に 'DataSet'のサブクラスを含めることをサポートしていることです。サブクラスは' -data'ゲッターをオーバーライドする可能性がありますが、iVarに直接アクセスすると無効になります。このソリューションは、より短く、より明確で、より多くの "Objective-"です。他のオブジェクト 'iVars'モデルで "while"ループを回避することは避けたいと思います。 –