autorelease内部指针/对象?

时间:2011-12-30 14:24:22

标签: objective-c

假设我有这段代码:

-(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的例子。请不要嘲笑我。 :)

2 个答案:

答案 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的末尾,即使另一个帖子释放它仍保留在其上。