在cocoa中声明私有变量的最佳方法

时间:2011-04-11 00:29:17

标签: cocoa properties private instance-variables

我想知道在cocoa中声明私有实例变量的建议是什么。这个问题是在iPhone上开发应用程序的背景下。

我知道至少有三种声明私有变量的方法:

  1. 使用修饰符@private在h文件的界面中声明它们:

    @interface MyClass : NSObject {  
      @private  
      NSObject * myPrivateVar;   
    }
    
  2. 在m文件的实现部分声明它们:

    @implementation MyClass  
    NSObject * myPrivateVar;
    
  3. 在m文件的接口中声明一个属性(甚至不声明变量本身):

    @interface MyClass ()  
    @property (nonatomic, retain) NSString* myPrivateVar;  
    @end  
    @implementation  
    @synthesize myPrivateVar;
    
  4. 到目前为止,我已广泛使用2但最近才意识到由于缺乏垃圾收集,这可能是危险的。是否存在使用该方法完全可以接受的情况?

    3更合适吗?答案是否取决于对象类型(例如mutable / immutable)?

    参考材料的指针一般也赞赏使用/不使用属性的权衡。

1 个答案:

答案 0 :(得分:5)

您的三个选项具有不同的语义:

  1. 这会创建一个实例变量。如果没有垃圾回收,您需要将retain / release个对象存储到myPrivateVar
  2. 根本不会定义实例变量。在@interface之外定义的变量和许多方法(或函数)定义的范围是“全局的” - 有效的类变量(Objective-C没有特殊的语法)。这样的变量由MyClass
  3. 的所有实例共享
  4. 使用属性(有或没有显式声明变量)之间的区别归结为内存管理。与retain一样定义意味着当您没有垃圾收集时,不需要retain / release
  5. 所以不要用2!如果你没有垃圾收集,选项3显然有好处,它提供了一些抽象措施而不是选项1,并且成本更高 - 尽管你可能不会注意到计算密集型代码之外的差异,这些代码会大量访问变量。

    更新2015

    ARC 上方使用垃圾收集 (自动引用计数)现在更适用(垃圾收集现已弃用)。现在还有第四种选择:

    1. 在m文件的实现部分声明它们:

      @implementation MyClass  
      {
         NSObject * myPrivateVar;
      }
      

      与选项(2)不同,这确实声明了一个实例变量。该变量对于实现是私有的,并且ARC内存管理是自动的。这个和(3)之间的选择[顺便说一下也不再需要@synthesize]归结为选择和需要;属性为您提供点语法,自定义setter和/或getter的能力,以及分配时自动复制的copy属性,但如果您不需要这些属性,则只需使用实例变量。