声明具有不同名称的两个属性将指向同一个变量

时间:2012-05-02 11:30:03

标签: iphone objective-c ios cocoa-touch

一般来说,我希望不同名称的属性指向同一个变量。

原因是我希望我的类符合MKAnnotation,我希望title属性与我名为name的其他属性具有相同的值,对我来说,不更改原始属性的名称非常重要(名称)。

如果没有两个对象并且只将一个对象克隆到另一个对象中,是否有一种聪明的方法可以做到这一点?

3 个答案:

答案 0 :(得分:2)

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方法来通知KVO title依赖于name,因为在name:被调用时,setTitle的观察者不会知道。您可能还想通过提供+keyPathsForValuesAffectingName告诉KVO关于其他方向的依赖关系来解决这个问题。我不认为这有效,即使它似乎在实验中,我也不会依赖它。它倾向于无限递归或框架只是忽略循环依赖(以避免无限递归)。

答案 1 :(得分: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

注意:如果发生突变,这将导致Key-Value Observing问题,因为观察者只会被告知被调用的方法,而不是实际值的变化。

答案 2 :(得分:-2)

yourObject.firstProperty = [[AClass alloc] init];  // ---> alloc or set to an existing object...

yourObject.secondProperty = yourObject.firstProperty;

这样两个属性都指向同一个分配的对象