一般来说,我希望具有不同名称的属性指向同一个变量。
这样做的原因是我希望我的类符合 MKAnnotation 并且我希望 title 属性与我的另一个名为 name 的属性具有相同的值,并且不要更改我的原始属性的名称(名称)对我来说非常重要。
有没有一种聪明的方法可以做到这一点,而无需拥有两个对象并将一个对象克隆到另一个对象中?
一般来说,我希望具有不同名称的属性指向同一个变量。
这样做的原因是我希望我的类符合 MKAnnotation 并且我希望 title 属性与我的另一个名为 name 的属性具有相同的值,并且不要更改我的原始属性的名称(名称)对我来说非常重要。
有没有一种聪明的方法可以做到这一点,而无需拥有两个对象并将一个对象克隆到另一个对象中?
HotLicks 和 TheSaad 的答案的问题与键值观察 (KVO) 合规性有关。如果有东西正在观察您的name
财产,您需要通知他们是否有其他东西调用了setTitle:
setter。反之亦然。
我会@synthesize
像往常一样推荐你的一个属性。例如,我假设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
通知title
依赖于的 KVO 的方法name
,因为这不会让观察者name
知道setTitle
: 何时被调用。您可能很想通过+keyPathsForValuesAffectingName
告诉 KVO 关于另一个方向的依赖关系来解决这个问题。我认为这行不通,即使它似乎在实验中,我也不会依赖它。它容易发生无限递归或框架只是忽略循环依赖(以避免无限递归)。
无需合成,您只需为属性编写自己的访问器。您可以这样做。
在您的界面中:
@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
注意:如果发生突变,这将导致 Key-Value Observing 出现问题,因为观察者只会被通知有关被调用的方法,而不是实际值的突变。
yourObject.firstProperty = [[AClass alloc] init]; // ---> alloc or set to an existing object...
yourObject.secondProperty = yourObject.firstProperty;
这样两个属性都指向同一个分配的对象