2012-03-17 49 views
1

我很熟悉Objective-C,正如你可能收集的一样,直到最近,我还没有真正理解所有这些AutoRelease malarky的需求。我认为这主要是因为我已经用ARC开始了Objective-C,并且没有任何接触保留和发布的机会。无论如何,我现在的理解是,ARC之前,如果你创建了一个对象,并且需要返回一个指向它作为方法/函数的返回对象的指针,那么你需要自动释放它,因为你无法做完“return obj”之后再做“[obj release]”在Objective-C中使用ARC时AutoRelease是否是多余的?

担心保留和发布不是ARC的问题。这是否意味着在我们自己的代码中,真正需要创建自己的自动释放对象?也就是说,[[[Class alloc] init] autorelease]?从我收集的内容来看,我们仍然应该设置autorelease池,但仅仅是因为其他框架或库可能会返回自动释放对象,但我们不再需要自己显式创建自动释放对象 - 这是否是一种公平的理解?

感谢, 尼克

+5

调用'autorelease'在ARC编译的代码中是非法的,对'retain'和'release'的调用也是非法的。 – jlehr 2012-03-17 19:07:57

回答

3

当使用ARC,你不想自己做任何内存管理。具体来说,你不会调用发布和自动发布,因为它为你做了这一切。事实上,如果你试图自己管理内存,编译器应该可能会抱怨。

而不是[[[Class alloc] init] autorelease];你只需要调用[[Class alloc] init];

我建议你阅读这blog post对ARC一些非常好的背景和内存管理一般。

+0

太棒了,谢谢。博客文章也很棒! ñ – 2012-03-17 19:08:37

0

那么,你的理解是非常正确的。使用ARC我们不会发布或自动发布。只需要确保我们将零(或其他合理的值)赋给任何对象的引用,我们不再需要这些引用。在最坏的情况下,我们仍然可以不断消耗额外的内存,但内存不会泄漏任何矿石。

是的,为了使用可能不使用ARC的框架库(链接库),我们仍然保留autorelease池。

为了回答你关于autorelease目的的问题。当然,这仅适用于非ARC项目。 在过去的美好时光中,Objective-C没有提供任何引用计数,但保留计数。任何未被保留的对象(或保留计数为0)的已分配内存都被认为是免费的,并且可能很快被其他对象声明和使用。 这意味着每个对象在分配之后都需要保留,假设你想保留它。当对象不再使用时,则需要释放它。这带来两个风险。那么,alloc会自动保留一次。 1)您可能会忘记释放未使用的对象。在最糟糕的情况下,你甚至可能会丢失所有对存储在内存中的对象的引用。 2)你仍然可以引用一个已经释放的对象帽子,然后尝试访问它,这很可能以BAD_EXC异常结束。

所有这些都可能很烦人。为了摆脱那些不长时间呆在一起的物品的一些义务,autorelease被发明出来。对于只有你分配的临时对象(release-count = 1)并自动释放它。这意味着该对象将在下一个自动释放循环中自动释放(保留计数减1)。但是,在执行时,该对象仍将分配给您的方法。通常,参考变量将是本地变量。

样品:

-(void) myMethod{ 

AClass *someObject = [[[AClass alloc] init] autorelease]; 

// use the object 

// probably hand it to another object if that takes ownership, i.e. add it ot an Array using addObject: 

// don't care any more 

} 

而且使用ARC时不需要任何更多。

相关问题