我总是在viewDidLoad方法中看到示例代码,而不是说
someInstanceVar = [[Classname alloc] init];
他们总是去
Classname *tempVar = [[Classname alloc] init]; someInstanceVar = tempVar; [tempVar release];
为什么是这样?是不是完全相同的事情,只是更长?
解决方法
简短的答案:这种模式一直显示在iPhone代码中,因为它被认为是创建新对象并将其分配给成员变量的最佳方式,同时仍然遵守所有内存管理规则并调用适当的副作用(如果任何),同时也避免使用自动释放.
细节:
你的第二个例子会创建一个僵尸,因为var留下一个已经被释放的内存的指针.更可能的用例如下所示:
tempVar = [[Classname alloc] init]; self.propertyVar = tempVar; [tempVar release];
假设propertyVar是一个声明为copy或retain属性的代码,则该代码将新对象的所有权移交给该类.
更新1:以下代码是等效的,但不推荐*在iOS上,这可能是为什么大多数iPhone程序使用第一个模式.
self.propertyVar = [[[Classname alloc] init] autorelease];
*自动释放在iOS上为discouraged,因为过度使用可能会导致问题.确保你永远不会使用它的最简单的方法是永远不要使用它,所以你会经常看到使用alloc / init和release的iOS代码,即使自动释放是可以接受的.这是一个编码器偏好的问题.
更新2:由于Cocoa在后台自动执行内存管理,这种模式首先看起来很混乱.这一切的关键是用于设置成员变量的点符号.为了帮助说明,请考虑以下两行代码相同:
self.propertyVar = value; [self setPropertyVar:value];
当您使用点符号时,Cocoa将调用指定的成员变量的属性访问器.如果该属性被定义为副本或保留属性(这是此模式在不创建僵尸的情况下工作的唯一方法),则会发生几个非常重要的事情:
>以前存储在propertyVar中的任何值都被释放>保留或复制新值>会自动处理任何副作用(例如KVC / KVO通知)