为什么我一直看到双重财产声明?

时间:2012-04-18 04:19:20

标签: objective-c ios

  

可能重复:
  When do I need to have both iVar and a property?

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

2 个答案:

答案 0 :(得分:3)

@interface内的块是您班级的ivars,而它下面的3个元素是properties,即您的ivars的访问者(getter和setter)。< / p>

  

您通常会访问对象的属性(就其而言)   属性和关系)通过一对访问器   ( 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

答案 1 :(得分:2)

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