我今天发现了这一点,只想验证我对正在发生的事情的理解。 " prefixName"是一个readonly属性,它使用getter方法直接传回一个值,没有iVar将结果存储在PR_ViewController对象上。此外,如果该属性不是只读添加一个setter仍然无法工作,因为没有设置iVar。
相比之下" characterName"通常用于属性,添加一个getter,一个setter和一个iVar。
@interface PR_ViewController : UIViewController
@property (nonatomic, readonly) NSString *prefixName;
@property (nonatomic, retain) NSString *characterName;
@implementation PR_ViewController
@synthesize characterName;
- (NSString *)prefixName {
return @"FRED";
}
答案 0 :(得分:7)
您不需要合成访问器 - 您可以自己完美地编写它们,这就是您的示例中所做的。
此外,只读属性不必基于ivar,但可以基于其他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
属性也会发生更改,并且其更改会传播到其侦听器(感谢keyPathsForValuesAffectingArea
。 )
您还可以在此doc中看到fullName
示例。