《ARC以及非ARC的討論》

來源:互聯網
上載者:User

ARC的機制是什嗎?它在那裡放入retain/release函數調用?

請停止思考這些問題,把更多的精力放在下面的問題上,比如你的程式邏輯,對象的強,弱引用,對象的所屬關係,可能的循環參考等問題上。

我還需要為我的類寫一個dealloc函數嗎?

可能。

因為ARC並不自動調用malloc/free,並不自動管理像核心功能對象、檔案描述符等的生命週期,所以你仍然需要在dealloc中釋放它們。

你不會(實際上是不能)釋放對象執行個體,但是你仍然需要為系統類別調用[self setDelegate:nil]或其他ARC不會自動生產釋放代碼的情況下釋放資源。

dealloc方法在ARC不是必須的,並且不許調用[super dealloc]。

ARC中會出現循環參考(retain cycles)嗎?

是的。

ARC自動產生retain/release函數,同時也繼承了產生循環參考的機制。幸運的是,ARC很少有記憶體流失,因為在聲明屬性的變數的時候決定是否使用retain。

註:請搜尋什麼是retain cycles.

ARC下面的塊代碼如何工作?

塊代碼在ARC方式下,只能在棧上傳遞的方式下工作,比如在return語句中。你不用在調用Block Copy。你還是必須在為arrayWithObjects: 傳入棧的時候使用[^{} copy]和其他的retain功能的函數。

有 一件事情需要提到,在ARC方式下,__block NSString *S是可以使用,它不是一個野指標。使用_block __unsafe_unretained NSString *S 或者 (更好的方式) __block __weak NSString *S.

在支援ARC的工程中我能建立執行個體數組嗎?

是的,你可以,如下例所示:

// Note calloc() to get zero-filled memory.__strong SomeClass **dynamicArray = (__strong SomeClass **)calloc(sizeof(SomeClass *), entries);for (int i = 0; i < entries; i++) {dynamicArray[i] = [[SomeClass alloc] init];}// When you're done, set each entry to nil to tell ARC to release the object.for (int i = 0; i < entries; i++) {dynamicArray[i] = nil;}free(dynamicArray);

這裡有幾點需要注意的地方:

  • 你必須在某些情況下寫__strong SomeClass **,因為如果你不寫,預設的是__autoreleasing SomeClass **.

  • 申請的記憶體必須使用0填充。

  • 在釋放這個數組前,你必須設定每一個元素為nil(調用memset,並傳入0是沒有用的)。

  • 你必須避免使用memcpy或realloc。

ARC慢嗎?

這 個取決你如何衡量這個問題了,不過一般來說,這個問題的答案是“no”。下面是原文的解釋,我總結的是要相信編譯器在這個方面的能力。

It depends on what you’re measuring, but generally “no.” The compiler efficiently eliminates many extraneousretain/release calls and much effort has been invested in speeding up the Objective-C runtime in general. In particular, the common “return a retain/autoreleased object” pattern is much faster and does not actually put the object into the autorelease pool, when the caller of the method is ARC code.

One issue to be aware of is that the optimizer is not run in common debug configurations, so expect to see a lot more retain/release traffic at-O0 than at-Os.

在ObjC++模式,ARC能否工作?

式的,你甚至可以在類或者容器中使用strong/weak id。為了能正常工作,ARC在編譯期間會在複製建構函式和解構函式中加入retain/release方面的邏輯。一個事情需要避免的就是,你不能為某些指標使用__strong,例如:

std::vector<__strong NSString*> V;

那些類不支援自動nil化的弱引用?

下面的類的執行個體不能使用自動nil化的弱引用

NSATSTypesetter, NSColorSpace, NSFont, NSFontManager, NSFontPanel, NSImage,NSMenuView,NSParagraphStyle,NSSimpleHorizontalTypesetter,NSTableCellView,NSTextView,NSViewController,NSWindow, andNSWindowController. 還有,OS X上的AV Foundation架構中所有類都不支援自動nil化的弱引用。

如果屬性變數是這些類的執行個體的時候,使用assign來替代weak;作為變數,使用__unsafe_unretained來替代__weak。

此外,你也不用對NSHashTable,NSMapTable, 和NSPointerArray的執行個體做弱應用。

在寫類似於NSCell這樣使用了NSCopyOjbect的子類的時候有什麼需要特別關注的地方嗎?

沒有什麼特別的,ARC會做一切事情。

我可以為每一個檔案單獨指定是否使用ARC嗎?

是的。

當你為一箇舊的工程添加ARC是,編譯選項-fobjc-arc對所有的檔案都是有效。你可以使用編譯選項-fno-objc-arc為某個類單獨禁止ARC。在target上的Build Phases 頁,開啟Compile Sources組,這裡有一個檔案清單,雙擊某個檔案,加入-fno-objc-arc就可以為這個檔案禁用ARC。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.