2012-03-17 53 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時不需要任何更多。

相關問題