在objective-c中保留对象
Posted
技术标签:
【中文标题】在objective-c中保留对象【英文标题】:retain object in objective-c 【发布时间】:2010-03-10 12:16:24 【问题描述】:我在做一个set方法:
OBS:somobject 是一个类的属性。
– (void)setSomeObject:(SomeObject *)newSomeobject [某些对象自动释放]; someobject = [newSomeobject 保留]; 返回;关于 [somobject autorelease] 我声明我不想更多地拥有 setSomeObject 范围内的对象。
被另一个对象保留的“someobject”会被释放吗?还是只在 setSomeObject 方法上释放对象?
如果 someobject 类属性已经存在?
这个对象的行为是什么?
【问题讨论】:
【参考方案1】:我将重命名方法中的参数,使其与 ivar 不同:
– (void)setSomeObject:(SomeObject *)newObject
[someobject autorelease];
someobject = [newObject retain];
您还应该阅读有关内存管理的 Apple 文档以及 @property
和 @synthesize
。
【讨论】:
【参考方案2】:你有一个严重的问题,你似乎有两个同名的变量(方法参数和一个实例变量)。编译器(以及这个问题的读者,就此而言)无法分辨您指的是哪个。
有关内存管理问题,请查看Apple's programming guide.
【讨论】:
好的,我已经阅读并理解了。谢谢。 someobject 将被释放,属性将设置为另一个属性,并在 newSomeObject 上调用 retain 以确保对象所有权。【参考方案3】:你需要在 setter 中完成的是:
-
释放任何旧对象
保留新对象
将新对象分配给您的实例变量
当然,如果您按字面意思执行此操作,那么在旧对象和新对象相同的情况下,您可能会过早释放对象。这就是“自动释放”派上用场的地方,因为它安排要释放的对象,但仅在您的方法返回之后。
将方法参数和实例变量命名为相同(恕我直言)令人困惑,并且会给你一个编译器警告,但如果你绝对坚持这样做,你可以使用“self->”来指定你'引用实例变量:
– (void)setSomeObject:(SomeObject *)someobject
[self->someobject autorelease];
self->someobject = [someobject retain];
return;
最后,除非您的 setter 方法必须做一些特殊的事情,否则您应该考虑使用 @synthesize 自动生成您的 setter/getter。
【讨论】:
大卫,你为什么放回车;我在很多例子上也看到了这个,不明白,如果方法会返回为什么要调用return? @okami 没有充分的理由。我复制/粘贴了您的原始代码并忽略了删除“return;”。你说得对,它毫无用处。 但它出现在 Mac Dev Center 的许多示例中。看:developer.apple.com/mac/library/documentation/Cocoa/Conceptual/… 转到“访问者方法”会话 是的,我明白了。但即使在那里,它们也不一致——有些例子有,但有些没有。它肯定一事无成。也许有些作者认为明确地说“不返回任何内容”会增加清晰度? (我碰巧不同意这个想法,但也许有些人同意。)以上是关于在objective-c中保留对象的主要内容,如果未能解决你的问题,请参考以下文章
iPhone Dev Objective-C - 对象被保留,我不知道在哪里
在 Objective-C 代码中使用 Swift 的缺点?