iOS中arc的設定與使用-fobjc-arc或者-fno-objc-arc
目中以前的一個複雜的想shi的類,今天leak測試的時候,發現收到記憶體警告,索性直接改為arc了
(arc是iOS 5推出的新功能,那些概念性的話就不多說了).
發個小帖,僅供新手看~
舊工程配置arc方案:
1,直接在targets->build phases中修改compiler Flags,是否支援arc。新增:-fobjc-arc,就可以讓舊專案支援arc。如果想讓原來支援arc的不使用arc則新增-fno-objc-arc
2,因為在build phases中可以改變是否支援arc,所以應該在程式碼中新增判斷是否支援arc,這樣不管以後.m的arc是否改變,都不用再次調整程式碼。
下面是一個.h檔案(附件中也上傳了.h),整合了arc的各種屬性、release判斷,直接#import在你想使用arc的類中即可。
#ifndef paixiu_PXISARC_h
#define paixiu_PXISARC_h
#ifndef PX_STRONG
#if __has_feature(objc_arc)
#define PX_STRONG strong
#else
#define PX_STRONG retain
#endif
#endif
#ifndef PX_WEAK
#if __has_feature(objc_arc_weak)
#define PX_WEAK weak
#elif __has_feature(objc_arc)
#define PX_WEAK unsafe_unretained
#else
#define PX_WEAK assign
#endif
#endif
#if __has_feature(objc_arc)
#define PX_AUTORELEASE(expression) expression
#define PX_RELEASE(expression) expression
#define PX_RETAIN(expression) expression
#else
#define PX_AUTORELEASE(expression) [expression autorelease]
#define PX_RELEASE(expression) [expression release]
#define PX_RETAIN(expression) [expression retain]
#endif
#endif
說明:在arc中,strong對應原來的retain與copy,weak對應原來的assign。
EX:舉例使用autorelease:
NSArray *testArray
= PX_AUTORELEASE([[NSArray alloc] init]);
//如果支援arc,testArray就只是alloc
init,release的事情由系統來做。
//如果不支援arc,那這條語句相當於:
NSArray *testArray = [[[NSArray alloc] init] autorelease];
這樣不管以後改不改arc,都不會記憶體洩漏了
.
所以,arc的使用有兩點:
A:在build
phases中修改compiler Flags值。
B:在程式碼中判斷是否支援arc,包括對屬性(property)、釋放(release)的判斷。
3,在dealloc中需要這樣做:
類如果註冊了通知(觀察者模式),需要remove掉。這個不管是否支援arc,都必須要做的。
-
(void)dealloc {
[[NSNotificationCenterdefaultCenter] removeObserver:self];//如果註冊了通知的話。
[self removeObserver:self forKeyPath:keyPath];//如果註冊了kvo的話。
#if !__has_feature(objc_arc) //在這裡也需要判斷是否支援arc,支援的話就執行舊工程中該release的語句.
[array release]; //array代表alloc但沒有autorelease的變數
[super dealloc];
#endif
}
4,另外加點block的判斷,這個是在4.0以後有的,當然也可以不進行判斷,因為現在大多數都4.0以後了。
#if
NS_BLOCKS_AVAILABLE
#endif
總結:
1,arc的設定是在build
phases中修改compiler Flags的值。
2,如果使用了arc,在你的程式碼中不可以使用retain,
release, autorelease,如果使用的話會報錯。
3,如果使用了arc,在@property宣告中,用strong代替retain。在支援
4,如果使用了arc,NSAutoReleasePool也不能使用,測試發現,用@autoreleasepool 代替,不會編譯報錯。 總之,一切你之前“背過”的那幾條記憶體管理規則,你都不用去管了。而且,個人感覺,用arc程式碼清晰很多,而且效率也提高了些。