【发布时间】:2011-12-31 21:57:39
【问题描述】:
根据我对通过保留/释放管理内存的“规则”的理解,如果您分配/复制/保留一个对象,您必须始终(最终)释放它:
id foo = [[MyClass alloc] init];
id bar = [[MyClass alloc] init];
[bar takeOwnership:foo]; //bar retains foo
[foo release]; //I'm done with it now, so I release it
如果我想改为创建 foo inline 该怎么办,如下所示:
id bar = [[MyClass alloc] init];
[bar takeOwnership:[[MyClass alloc] init]];
当我分配它时,我显然不能释放以前称为 foo 的对象,如果没有引用,我以后也不能释放它。实际上,采用“如果你拥有它,你必须释放它”的方法似乎意味着如果你不希望它最终泄漏,你就不能内联分配对象。
那么:内联分配东西真的被禁止吗?虽然上面的例子有点做作并且明显的解决方案就是不这样做,但在我看来,在某些情况下,能够这样做在语义上是可取的(事实上,我发现自己在这样的情况下)一种情况)。在这些情况下 - 也就是说,假设我希望能够如上所示内联分配对象 - 有没有办法做到这一点而不会完全破坏对象不是内联分配的“正常”情况?
如果有帮助,我可以提供有关我正在尝试做的事情的详细信息,但希望以上内容能解决我的问题。
【问题讨论】:
-
一个简单的答案是不要那样做——做单独的分配。或者使用自动释放。我相信在 Objective-C 中你可以做类似
id temp; [bar takeOwnership:temp = [[MyClass alloc] init]]; [temp release];的事情,如果这能让你感觉更好的话,但是在功能或性能方面,单行语句与多语句相比并没有真正的优势。 -
但是,如果你觉得你必须做一个单行,出于某种模糊的原因,并且
takeOwnership是你自己的方法,让它返回它的参数和代码[[bar takeOwnership:[[MyClass alloc] init]] release];。跨度>
标签: objective-c memory-management