根据我对通过保留/释放管理内存的“规则”的理解,如果你分配/复制/保留一个对象,你必须总是(最终)释放它:
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,我该怎么做,如下所示:
id bar = [[MyClass alloc] init];
[bar takeOwnership:[[MyClass alloc] init]];
当我分配它时,我显然无法释放以前称为foo的对象,如果没有引用,我也无法在以后释放它。实际上,如果您不希望它最终泄漏到线上,那么采用“如果您拥有它就必须释放它”的方法似乎意味着您无法在线分配对象。
所以:在线分配内容真的是禁止的吗?虽然上面的例子有点做作,显而易见的解决办法就是不做,但在我看来,在某种情况下,能够做到这一点在语义上是可取的(事实上,我发现自己就是这样的一种情况)。在那些情况下 - 也就是说,假设我希望能够如上所示内联分配对象 - 有没有办法在不完全打破对象没有内联分配的“正常”情况下这样做?
如果有帮助的话,我可以提供我正在尝试做的事情的详细信息,但希望以上内容可以解决我的问题。
答案 0 :(得分:6)
[bar takeOwnership:[[MyClass alloc] init]];
如果您使用ARC(您应该使用ARC),则不会做任何不同的事情。它“只是有效”。
如果您使用的是手动保留释放(MRR),则:
[bar takeOwnership:[[[MyClass alloc] init] autorelease]];
请注意,自动释放压力可能是性能问题;即你可能想要避免因为这个原因而自动释放的内联案例。但是,除非您在池耗尽之前100次/ 1000次通过此代码路径,否则不要担心。