没有iVar和getter方法的属性?

fuz*_*oat 1 iphone cocoa-touch objective-c

我今天发现了这一点,只想验证我对正在发生的事情的理解."prefixName"是一个只读属性,它使用getter方法直接传回一个值,没有iVar将结果存储在PR_ViewController对象上.此外,如果该属性不是readonly添加一个setter仍然无法工作,因为没有设置iVar.

  • 创建:[Meth] prefixName

相比之下,"characterName"通常用于属性,添加一个getter,一个setter和一个iVar.

  • 创建:[Meth] characterName
  • 创建:[Meth] setCharacterName
  • 创建:[iVar] characterName

.

@interface PR_ViewController : UIViewController
@property (nonatomic, readonly) NSString *prefixName;
@property (nonatomic, retain) NSString *characterName;
Run Code Online (Sandbox Code Playgroud)

.

@implementation PR_ViewController
@synthesize characterName;

- (NSString *)prefixName {
    return @"FRED";
}
Run Code Online (Sandbox Code Playgroud)

Mon*_*olo 7

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

此外,只读属性不必基于ivar,而是可以基于其他ivars或属性来计算.如果您使用绑定在UI中显示从其他属性派生的值,这是非常有用的,前提是您喜欢该编码样式.

以下是基于另外两个属性计算的只读属性的简单示例:

头文件:

@property double width;
@property double height;

@property (readonly) double area;
Run Code Online (Sandbox Code Playgroud)

执行:

@synthesize width, height;

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


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

现在,只要其中一个widthheight更改,area属性也会更改,并且其更改将传播到其侦听器(由于keyPathsForValuesAffectingArea.)

您还可以fullName在此文档中查看示例.