1

一般に、同じ変数を指すために異なる名前のプロパティが必要です。

その理由は、クラスを MKAnnotation に準拠させ、title プロパティを name という他のプロパティと同じ値にする必要があり、元のプロパティ (名前) の名前を変更しないことが非常に重要であるためです。

2 つのオブジェクトを持たずに、一方を他方に複製するスマートな方法はありますか?

4

3 に答える 3

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)をポイントしてから、に依存する+keyPathsForValuesAffectingTitleKVOに通知するメソッドだけを提供することはできません。これは、:がいつ呼び出されたかをオブザーバーに通知しないためです。他の方向への依存関係についてKVOに通知することも提供することで、これを修正したくなるかもしれません。私はそれがうまくいくとは思いませんし、実験でそう見えたとしても、私はそれに依存しません。無限再帰になるか、フレームワークが循環依存を単に無視する傾向があります(無限再帰を回避するため)。titlenamenamesetTitle+keyPathsForValuesAffectingName

于 2012-05-02T12:39:36.067 に答える
1

合成する代わりに、プロパティ用の独自のアクセサーを作成するだけです。次のように行うことができます。

あなたのインターフェースで:

@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

注: オブザーバーには、実際の値の変更ではなく、呼び出されたメソッドについてのみ通知されるため、変更が発生した場合、キー値の監視で問題が発生します。

于 2012-05-02T11:37:27.443 に答える
-2
yourObject.firstProperty = [[AClass alloc] init];  // ---> alloc or set to an existing object...

yourObject.secondProperty = yourObject.firstProperty;

このようにして、両方のプロパティが同じ割り当てられたオブジェクトを指します

于 2012-05-02T11:35:29.390 に答える