我在Objective-C代码中看到以下内容。
@interface Contact : RKObject {
NSNumber* _identifier;
NSString* _name;
NSString* _company;
}
@property (nonatomic, retain) NSNumber* identifier;
@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSString* company;
为什么还需要带有接口的块内部的位?是不是使用@synthesize?
答案 0 :(得分:3)
@interface
内的块是您班级的ivars
,而它下面的3个元素是properties
,即您的ivars的访问者(getter和setter)。< / p>
您通常会访问对象的属性(就其而言) 属性和关系)通过一对访问器 ( getter / setter )方法。通过使用访问器方法,您遵守 封装原理。你可以锻炼身体 控制getter / setter对和底层行为的行为 国家管理,而API的客户仍然与 实施变化。
虽然使用存取方法因此具有显着优势, 编写访问器方法是一个繁琐的过程。而且,方方面面 剩下可能对API的消费者很重要的属性 模糊 - 例如访问器方法是否是线程安全的 设置时是否复制新值。
声明属性 通过提供以下内容解决这些问题 特征强>
- 属性声明提供了一个清晰明确的访问器方法行为规范。
- 编译器可以根据您在声明中提供的规范为您合成访问器方法。
- 属性在语法上表示为标识符并且是作用域的,因此编译器可以检测未声明属性的使用。
答案 1 :(得分:2)
扩展kameleon博士的回答,在这种情况下,iVars是不必要的,因为它们可以在@synthesize行明确声明。例如,@synthesize name = _name
与在.h中声明iVar相同(请注意,此语法需要该属性)。没有一个比另一个更好,一个是更有效的编码。