2012-01-09 59 views
0

我今天发现了这个,只是想验证我对发生了什么事的理解。 “prefixName”是一个使用getter方法直接传回值的只读属性,没有iVar将结果存储在PR_ViewController对象上。此外,如果该属性不是只读添加一个setter仍然不会工作,因为没有iVar设置。没有iVar和getter方法的属性?

  • 创建:[甲基] prefixName

相比之下 “characterName” 适用于一个属性通常的方式,加入了吸气剂,一个设置器和一个IVAR。

  • 创建:[甲基] characterName
  • 创建:[甲基] setCharacterName
  • 创建:[IVAR] characterName

@interface PR_ViewController : UIViewController 
@property (nonatomic, readonly) NSString *prefixName; 
@property (nonatomic, retain) NSString *characterName; 

@implementation PR_ViewController 
@synthesize characterName; 

- (NSString *)prefixName { 
    return @"FRED"; 
} 
+0

不要重复您的问题。请关闭其中一个。 – Ilanchezhian 2012-01-09 13:04:33

+0

你正确地理解它。 – 2012-01-09 13:04:37

+0

[Property with no iVar and getter method?]可能重复?(http://stackoverflow.com/questions/8788773/property-with-no-ivar-and-getter-method) – rckoenes 2012-01-09 13:34:00

回答

7

您不需要综合访问器 - 您可以完全自己编写它们,这就是您的示例中所做的。

此外,只读属性不必基于伊娃,但可以基于其他ivars或属性进行计算。如果您使用绑定来显示UI中从其他属性派生的值(如果您喜欢该编码风格的话),这会非常有用。

这里是一个只读属性基于其它两个属性计算的简单示例:

头文件:

@property double width; 
@property double height; 

@property (readonly) double area; 

实现:

@synthesize width, height; 

- (double)area 
{ 
    return width*height; 
} 


+ (NSSet *)keyPathsForValuesAffectingArea 
{ 
    return [NSSet setWithObjects:@"width", @"height", nil]; 
} 

现在,width每当任一或height更改,area属性也会更改,并且其更改会传播到其侦听器(比ks到keyPathsForValuesAffectingArea。)

您还可以在此doc中看到fullName示例。

+0

我知道你可以手动编写getter和setter,但更多的问题是没有iVar支持这个属性。在上面的例子中,prefixName在对象上没有一个iVar,characterName就是这样。 – fuzzygoat 2012-01-09 13:39:44

+0

我想我们彼此了解,但我认为它是伊娃只是存储或计算房产价值的众多方式之一。例如,它也可以是一组数字的总和。 – Monolo 2012-01-09 13:43:19

+0

谢谢,我想我现在可以理解它。在手动添加iVar或使用@synthesis生成iVar的情况下,手动添加访问器(getter&setter)。然而,getter返回没有价值,所以你必须在方法中计算一个值,就像明智地使用setter一样,没有什么可设置的,所以setter有点多余(除非你想要有点复杂和设置别的东西/其他一些iVar – fuzzygoat 2012-01-09 13:49:49

相关问题