0

可能重复:
我什么时候需要同时拥有 iVar 和属性?

我一直在 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?

4

2 回答 2

3

里面的块@interfaceivars你的类,而它下面的 3 个元素是properties,即你的 ivars 的访问器(getter 和 setter)。

您通常通过一对访问器 ( getter/setter ) 方法访问对象的属性(就其属性和关系而言) 。通过使用访问器方法,您遵循封装原则。您可以严格控制 getter/setter 对的行为和底层状态管理,同时 API 的客户端与实现更改保持隔离。

尽管因此使用访问器方法具有显着优势,但编写访问器方法是一个乏味的过程。此外,对于 API 的使用者可能很重要的属性的某些方面会被隐藏起来——例如访问器方法是否是线程安全的,或者在设置时是否复制新值。

声明的属性通过提供以下特性来解决这些问题:

  • 属性声明为访问器方法的行为方式提供了清晰、明确的规范。
  • 编译器可以根据您在声明中提供的规范为您合成访问器方法。
  • 属性在语法上表示为标识符并具有范围,因此编译器可以检测到未声明属性的使用。

参考: https ://developer.apple.com/library/mac/#documentation/cocoa/conceptual/objectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW1

于 2012-04-18T04:22:07.707 回答
2

扩展 kameleon 博士的回答,在这种情况下 iVar 是不必要的,因为它们可以在 @synthesize 行显式声明。例如,@synthesize name = _name与在 .h 中声明 iVar 相同(请注意,此语法需要该属性)。没有一个比另一个更好,一个只是更有效的编码。

于 2012-04-18T04:25:06.433 回答