为什么人们总是使用Objective-C(即iPhone)中的实例变量重新分配?

我总是在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通知)

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...