国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

《ARC以及非ARC的討論》

2019-11-14 20:28:19
字體:
來源:轉載
供稿:網友

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。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彰化县| 天全县| 神池县| 涞水县| 安吉县| 黄石市| 辉县市| 乌什县| 吐鲁番市| 南宁市| 应用必备| 龙江县| 永新县| 抚松县| 绥滨县| 油尖旺区| 星座| 新余市| 淮北市| 垣曲县| 万安县| 永顺县| 台湾省| 海城市| 电白县| 岗巴县| 邳州市| 汝州市| 会同县| 吐鲁番市| 巴马| 双桥区| 江陵县| 奉化市| 宁德市| 察哈| 池州市| 邵东县| 合水县| 辽源市| 淮北市|