ARC使用心得(一)

ARC使用心得(一)
作者:wangzz
轉載請註明出處
如果覺得文章對你有所幫助,請通過留言或關注微信公衆帳號wangzzstrive來支持我,謝謝!

寫在前面:

很久沒有更新日誌了,最近的一個月經歷了一段煉獄般的開發週期,那動不動加班到凌晨幾點的日子,說多了都是淚。。。

項目組在三週時間內完成了兩個月的工作量,瘋狂的趕工期,使得開發過程中沒時間研究某個功能使用哪種方式更好,只求能實現,因此也沒學到什麼新東西,唯一的收穫就是學會了ARC的基本使用。

可能是用慣了手動內存管理,而且基本上不會有內存泄露的的情況發生,當項目組領導說在新項目中要使用ARC的時候,還有一定的牴觸情緒。被趕鴨子上架般的強制要求使用了以後,慢慢被它的優點吸引,ARC確實大大減少了我們開發過程中在內存方面花費的時間。ARC的使用心得如下:

一、ARC使用環境

當前ARC是和IOS5一塊發佈的,很多人就以爲只有IOS5以後纔可以使用,事實上ARC 是 LLVM 3.0 編譯器的新特性。從OS X v10.6和v10.7上的64位應用,以及IOS4和IOS5開始,Xcode4.2版本開始,都可以使用。

二、ARC實現原理

1、會降低應用的性能嗎?

當初抵制使用ARC的另一個原因,竟然是以爲它會降低應用的性能,我把它和OS X和Java中的垃圾回收機制混爲一談了,現在想想真是可笑。好吧這個問題的答案是,使用ARC幾乎不會降低性能,甚至還有可能提示性能

官網上給的解釋是:

It depends on what you’re measuring, but generally “no.” The compiler efficiently eliminates many extraneous retain/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.

ARC主要可能從兩個方面使性能提升:

①編譯器會減少很多外來的retain/release調用,這在運行時會有助提升性能

②不需要將返回的autoreleased類型的對象加入到autorelease pool中,也能在一定程度上提升性能

事實上,上述兩條都是ARC在內存管理時優化性能的舉措,它的實現機制會不會導致性能降低呢?

2、ARC實現原理

ARC的英文全名是:Automatic Reference Counting,編譯器提供的管理Objective-C對象內存的一個機制。它並不是像垃圾回收機制那樣,有一個負責內存回收的系統,而是仍然以引用計數爲基礎,只是開發者可以像使用垃圾回收機制那樣,不用再(或者說只需要做少量的工作)爲對象什麼時候需要增加引用計數,什麼時候需要減少引用引用計數而絞盡腦汁,編譯器會爲我們做好一切:在編譯階段,編譯器會在需要retain或release對象的地方自動爲我們加上對應的代碼。官方文檔提供的圖片很形象:

總之,ARC的出現,讓我們可以將精力集中在功能代碼上。

三、ARC內存管理

1、內存管理規則

只有很簡單的一句話:一個Object-C對象存在strong類型的指針指向時,該對象就不會被釋放。

2、ARC中的屬性關鍵字

屬性、關鍵字和對應的所有權關係如下:


其中,屬性值一列都是用於聲明@property屬性聲明時用的,編譯器編譯後會將這些屬性值轉換成對應的關鍵字;關鍵字是用於聲明屬性列表或普通實例變量指針的

①strong
該屬性值對應 __strong 關鍵字,即該屬性所聲明的指針變量將成爲對象的持有者。strong是指向Objective-C對象指針的默認屬性。
②weak
該屬性對應__weak關鍵字,與__weak定義的變量一致,該屬性所聲明的變量將沒有對象的所有權,並且當對象被破棄之後,對象將被自動賦值nil。
③unsafe_unretained
等效於__unsafe_unretaind關鍵字聲明的變量;像上面說明的,iOS 5之前的系統用該屬性代替 weak 來使用。
④copy
也是對象的所有者,與strong的區別是聲明的指針變量是拷貝對象的持有者。
⑤assign
一般數值型變量用該屬性聲明,比如,int, BOOL,但無需顯示寫出,因爲數值型變量的默認屬性類型就是assign
⑥retain
該屬性與strong功能相同。


上述的6個屬性都可以在ARC中使用,但是assign和retain畢竟是MRC中的東西,而且assign和weak相比還是有不足之處的(下文會介紹),所以ARC中只推薦使用strong、weak、copy三個屬性。

3、使用關鍵字聲明指向Objective-C對象指針的規範書寫方式

①只有一個內存管理關鍵字時

規範的寫法如下所示:

//規範的寫法
MyClass * __weak myWeakReference;
不規範的寫法是:
//不規範的寫法
__weak MyClass * myWeakReference;
大家儘量按照第一種蘋果推薦的規範寫法編程。

②還有其它關鍵字時

規範寫法:

__block NSString * __weak myString

4、weak和assign的異同

相同點:

指向的對象都是隨時有可能被釋放,即不擁有指向的對象

不同點:

①weak只能用來聲明Objective-C對象,assign既可以用來聲明對象,也可以用來聲明數值型變量;

②很關鍵的一點區別,當一個weak關鍵字聲明的指針指向的對象被釋放掉得時候,該指針會自動的被指向nil,這就大大降低了程序崩潰的可能性!!!而assign不存在該特性

5、變量的默認屬性

使用@property聲明或作爲普通實例變量聲明的指向Objective-C對象的指針屬性默認都是strong;而使用@property聲明的數值型變量屬性默認的是assign,普通的數值型變量的屬性是__unsafe_unretaind。


**************************************未完待續**************************************

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章