gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:26:15 25 4
gpt4 key购买 nike

我总是在 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 被声明为 copyretain 属性,此代码将新对象的所有权交给类。

更新 1:以下代码是等效的,但不推荐*在 iOS 上使用,这可能是大多数 iPhone 程序改用第一种模式的原因。

self.propertyVar = [[[Classname alloc] init] autorelease];

* 自动释放是 discouraged在 iOS 上,因为过度使用会导致问题。确保您永远不会过度使用它的最简单方法就是永远不要全部使用它,因此您会经常看到使用 alloc/initrelease 的 iOS 代码,即使 code>autorelease 是可以接受的。这是编码人员偏好的问题。

更新 2: 由于 Cocoa 在幕后自动执行的内存管理,这种模式起初看起来令人困惑。这一切的关键是用于设置成员变量的点符号。为了帮助说明,请考虑以下两行代码相同:

self.propertyVar = value;
[self setPropertyVar:value];

当您使用点表示法时,Cocoa 将为指示的成员变量调用属性访问器。如果该属性已被定义为 copyretain 属性(这是此模式在不创建僵尸的情况下工作的唯一方法),那么会发生几件非常重要的事情:

  1. 释放之前存储在 propertyVar 中的任何值
  2. 保留或复制新值
  3. 自动处理任何副作用(例如 KVC/KVO 通知)

关于iphone - 为什么人们总是在 Objective-C(即 iPhone)中对实例变量使用重新分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3806694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com