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

Iphone 声明将指向同一变量的两个具有不同名称的属性,iphone,objective-c,ios,cocoa-touch,Iphone,Objective C,Ios,Cocoa Touch,一般来说,我希望使用不同名称的属性来指向同一个变量 原因是我希望我的类符合MKAnnotation,我希望title属性与我的另一个名为name的属性具有相同的值,这对我来说非常重要,不要更改原始属性(name)的名称 有没有一种聪明的方法可以做到这一点,而不必拥有两个对象,只需将一个对象克隆到另一个对象中 yourObject.firstProperty = [[AClass alloc] init]; // ---> alloc or set to an existing objec

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

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

有没有一种聪明的方法可以做到这一点,而不必拥有两个对象,只需将一个对象克隆到另一个对象中

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

yourObject.secondProperty = yourObject.firstProperty;
这样,两个属性都指向同一个已分配对象


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

,而无需进行合成,您只需为属性编写自己的访问器即可。你可以这样做

在您的界面中:

@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

注意:如果发生变异,这将导致键值观察出现问题,因为观察者只会被通知正在调用的方法,而不是实际值的变异。

您只需要为属性编写自己的访问器,而不是合成。你可以这样做

在您的界面中:

@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

注意:如果发生变异,这将导致键值观察出现问题,因为观察者只会被通知正在调用的方法,而不是实际值的变异。

HotLicks和Saad的答案的问题与键值观察(KVO)合规性有关。如果某个对象正在观察您的
name
属性,则需要在其他对象调用
setTitle:
setter时通知他们。反之亦然

我建议
@synthesis
-像往常一样使用您的一个属性。例如,我假设
name
就是这样做的。然后,您需要让另一个,
title
在本例中,传递到该属性,并告诉KVO有关依赖关系的信息:

- (void) setTitle:(NSString*)newTitle
{
    self.name = newTitle;
}

- (NSString*) title
{
    return self.name;
}

+ (NSSet *)keyPathsForValuesAffectingTitle
{
    return [NSSet setWithObject:@"name"];
}
要了解最后一种方法,请阅读文档


您不能仅通过
@synthesis
指向同一ivar(例如
\u name
),然后仅提供
+keypathsforvaluesafectingtitle
方法来通知KVO
title
依赖于
name
,因为这不会让
name
的观察者知道何时调用了
setTitle
:。您可能会试图通过提供
+keypathsforvaluesafectingname
来修复这一问题,以告诉KVO另一个方向的依赖关系。我认为这是行不通的,即使在实验中它似乎起作用,我也不会相信它。它倾向于无限递归或者框架简单地忽略循环依赖(以避免无限递归)。

HotLicks和Saad的答案的问题与键值观察(KVO)遵从性有关。如果某个对象正在观察您的
name
属性,则需要在其他对象调用
setTitle:
setter时通知他们。反之亦然

我建议
@synthesis
-像往常一样使用您的一个属性。例如,我假设
name
就是这样做的。然后,您需要让另一个,
title
在本例中,传递到该属性,并告诉KVO有关依赖关系的信息:

- (void) setTitle:(NSString*)newTitle
{
    self.name = newTitle;
}

- (NSString*) title
{
    return self.name;
}

+ (NSSet *)keyPathsForValuesAffectingTitle
{
    return [NSSet setWithObject:@"name"];
}
要了解最后一种方法,请阅读文档


您不能仅通过
@synthesis
指向同一ivar(例如
\u name
),然后仅提供
+keypathsforvaluesafectingtitle
方法来通知KVO
title
依赖于
name
,因为这不会让
name
的观察者知道何时调用了
setTitle
:。您可能会试图通过提供
+keypathsforvaluesafectingname
来修复这一问题,以告诉KVO另一个方向的依赖关系。我认为这是行不通的,即使在实验中它似乎起作用,我也不会相信它。它倾向于无限递归,或者框架简单地忽略循环依赖(以避免无限递归)。

有两个指向同一变量的属性<代码>@a=var@合成b=var有两个指向同一变量的属性<代码>@a=var@合成b=var