我想知道在cocoa中声明私有实例变量的建议是什么。这个问题是在iPhone上开发应用程序的背景下。
我知道至少有三种声明私有变量的方法:
使用修饰符@private在h文件的界面中声明它们:
@interface MyClass : NSObject {
@private
NSObject * myPrivateVar;
}
在m文件的实现部分声明它们:
@implementation MyClass
NSObject * myPrivateVar;
在m文件的接口中声明一个属性(甚至不声明变量本身):
@interface MyClass ()
@property (nonatomic, retain) NSString* myPrivateVar;
@end
@implementation
@synthesize myPrivateVar;
到目前为止,我已广泛使用2但最近才意识到由于缺乏垃圾收集,这可能是危险的。是否存在使用该方法完全可以接受的情况?
3更合适吗?答案是否取决于对象类型(例如mutable / immutable)?
参考材料的指针一般也赞赏使用/不使用属性的权衡。
答案 0 :(得分:5)
您的三个选项具有不同的语义:
retain
/ release
个对象存储到myPrivateVar
。@interface
之外定义的变量和许多方法(或函数)定义的范围是“全局的” - 有效的类变量(Objective-C没有特殊的语法)。这样的变量由MyClass
。retain
一样定义意味着当您没有垃圾收集时,不需要retain
/ release
。所以不要用2!如果你没有垃圾收集,选项3显然有好处,它提供了一些抽象措施而不是选项1,并且成本更高 - 尽管你可能不会注意到计算密集型代码之外的差异,这些代码会大量访问变量。
更新2015
ARC 上方使用垃圾收集 (自动引用计数)现在更适用(垃圾收集现已弃用)。现在还有第四种选择:
在m文件的实现部分声明它们:
@implementation MyClass
{
NSObject * myPrivateVar;
}
与选项(2)不同,这确实声明了一个实例变量。该变量对于实现是私有的,并且ARC内存管理是自动的。这个和(3)之间的选择[顺便说一下也不再需要@synthesize
]归结为选择和需要;属性为您提供点语法,自定义setter和/或getter的能力,以及分配时自动复制的copy
属性,但如果您不需要这些属性,则只需使用实例变量。