一般に、同じ変数を指すために異なる名前のプロパティが必要です。
その理由は、クラスを MKAnnotation に準拠させ、title プロパティを name という他のプロパティと同じ値にする必要があり、元のプロパティ (名前) の名前を変更しないことが非常に重要であるためです。
2 つのオブジェクトを持たずに、一方を他方に複製するスマートな方法はありますか?
一般に、同じ変数を指すために異なる名前のプロパティが必要です。
その理由は、クラスを MKAnnotation に準拠させ、title プロパティを name という他のプロパティと同じ値にする必要があり、元のプロパティ (名前) の名前を変更しないことが非常に重要であるためです。
2 つのオブジェクトを持たずに、一方を他方に複製するスマートな方法はありますか?
HotLicksとTheSaadの回答の問題は、Key-Value Observing(KVO)への準拠に関係しています。何かがあなたのname
財産を監視している場合、他の何かがsetTitle:
セッターを呼んだ場合、あなたは彼らに通知される必要があります。およびその逆。
@synthesize
いつものようにあなたのプロパティの1つを-することをお勧めします。たとえば、それname
はそのように行われると仮定します。次に、もう一方を作成する必要があります。title
この場合は、そのプロパティにパススルーし、依存関係についてKVOに通知します。
- (void) setTitle:(NSString*)newTitle
{
self.name = newTitle;
}
- (NSString*) title
{
return self.name;
}
+ (NSSet *)keyPathsForValuesAffectingTitle
{
return [NSSet setWithObject:@"name"];
}
その最後の方法を理解するには、のドキュメントを読んでください+[NSKeyValueObserving keyPathsForValuesAffectingValueForKey:]
。
@synthesize
両方が同じivar(たとえば_name
)をポイントしてから、に依存する+keyPathsForValuesAffectingTitle
KVOに通知するメソッドだけを提供することはできません。これは、:がいつ呼び出されたかをオブザーバーに通知しないためです。他の方向への依存関係についてKVOに通知することも提供することで、これを修正したくなるかもしれません。私はそれがうまくいくとは思いませんし、実験でそう見えたとしても、私はそれに依存しません。無限再帰になるか、フレームワークが循環依存を単に無視する傾向があります(無限再帰を回避するため)。title
name
name
setTitle
+keyPathsForValuesAffectingName
合成する代わりに、プロパティ用の独自のアクセサーを作成するだけです。次のように行うことができます。
あなたのインターフェースで:
@interface Student
{
NSString *_name;
}
@property (readonly, nonatomic) NSString *firstName;
@property (readonly, nonatomic) NSString *lastName;
@end
あなたの実装では:
@implentation Student
- (NSString *)firstName
{
return _name;
}
- (NSString *)lastName
{
return _name;
}
@end
注: オブザーバーには、実際の値の変更ではなく、呼び出されたメソッドについてのみ通知されるため、変更が発生した場合、キー値の監視で問題が発生します。
yourObject.firstProperty = [[AClass alloc] init]; // ---> alloc or set to an existing object...
yourObject.secondProperty = yourObject.firstProperty;
このようにして、両方のプロパティが同じ割り当てられたオブジェクトを指します