假设我有这段代码:
-(SomeOtherType*) getMyObject {
SomeType someObject = [[SomeType alloc] init];
// ... later on
SomeOtherType toReturn = [[[someObject interiorObject] retain] autorelease];
[someObject release];
return toReturn;
}
toReturn
对象,我正确处理它吗?我想将其作为autoreleased
对象投放,但我确实要废弃someObject
。这是 模式转移所有权吗?我已经把它放在头脑和纸上了,似乎没问题,但我宁愿被更开明的人告知。
编辑这是一个非常人为的例子,只是为了说明手头的问题。 someObject
生活在许多方法调用中,最后,我想“抛弃它的胆量”。这不是Daily WTF的例子。请不要嘲笑我。 :)
答案 0 :(得分:2)
您在问题中提供的代码是正确的。让我们来看看为什么。在考虑保留/释放时,您需要考虑所有权。对象通常由另一个对象拥有或在某个特定范围内。在这种情况下getByObject
的范围。您要返回的对象是interiorObject
,由someObject
拥有。但是你需要在返回之前释放someObject
。正确的做法是取得interiorObject
的所有权并返回自动释放的副本。最后发布或自动释放someObject
。
如果在interiorObject
发布之前未向someObject
获取所有权,则interiorObject
可能会被取消分配,我们将返回一个悬空指针。有人第一次尝试向其发送消息时,程序可能会崩溃。
答案 1 :(得分:1)
我不是100%确定你需要做retain
/ autorelease
舞蹈,除非你期望另一个线程可能会释放你的对象吗?
- (SomeOtherType *)getMyObject
{
SomeType someObject = [[SomeType alloc] init];
// ... later on
SomeOtherType toReturn = [someObject interiorObject];
[someObject release];
return toReturn;
}
retain
/ autorelease
舞会保证对象会挂起到runloop的末尾,即使另一个帖子释放它仍保留在其上。