iOS開發中arc的設置與應用

舊工程配置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和weak代替相應的retain, copy,和assign。

4,如果使用了arc,NSAutoReleasePool也不能使用,測試發現,用@autoreleasepool 代替,不會編譯報錯。

 

總之,一切你之前“背過”的那幾條內存管理規則,你都不用去管了。而且,個人感覺,用arc代碼清晰很多,而且效率也提高了些。

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