舊工程配置arc方案:
1,直接在targets->build phases中修改compiler Flags,是否支持arc七咧。添加:-fobjc-arc炫贤,就可以讓舊項(xiàng)目支持arc清女。如果想讓原來支持arc的不使用arc則添加-fno-objc-arc
2,因?yàn)樵赽uild phases中可以改變是否支持arc舒岸,所以應(yīng)該在代碼中添加判斷是否支持arc吟榴,這樣不管以后.m的arc是否改變郊楣,都不用再次調(diào)整代碼。
下面是一個.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對應(yīng)原來的retain與copy准潭,weak對應(yīng)原來的assign。
EX:舉例使用autorelease:
NSArray *testArray = PX_AUTORELEASE([[NSArray alloc] init]);
//如果支持arc域仇,testArray就只是alloc init刑然,release的事情由系統(tǒng)來做。
//如果不支持arc暇务,那這條語句相當(dāng)于:
NSArray *testArray = [[[NSArray alloc] init] autorelease];
這樣不管以后改不改arc泼掠,都不會內(nèi)存泄漏了 .
所以,arc的使用有兩點(diǎn):
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苏携,支持的話就執(zhí)行舊工程中該release的語句.
[array release]; //array代表alloc但沒有autorelease的變量
[super dealloc];
#endif
}
4,另外加點(diǎn)block的判斷对粪,這個是在4.0以后有的右冻,當(dāng)然也可以不進(jìn)行判斷,因?yàn)楝F(xiàn)在大多數(shù)都4.0以后了著拭。
#if NS_BLOCKS_AVAILABLE
#endif
總結(jié):
1,arc的設(shè)置是在build phases中修改compiler Flags的值纱扭。
2,如果使用了arc,在你的代碼中不可以使用retain, release, autorelease儡遮,如果使用的話會報錯乳蛾。
3,如果使用了arc,在@property聲明中峦萎,用strong和weak代替相應(yīng)的retain,copy,和assign屡久。3,如果使用了arc忆首,在@property聲明中爱榔,用strong代替retain。在支持
__unsafe_unretained的情況下糙及,
__unsafe_unretained相當(dāng)于assign详幽。
4,如果使用了arc,NSAutoReleasePool也不能使用,測試發(fā)現(xiàn)唇聘,用@autoreleasepool 代替版姑,不會編譯報錯。
總之迟郎,一切你之前“背過”的那幾條內(nèi)存管理規(guī)則剥险,你都不用去管了。而且宪肖,個人感覺表制,用arc代碼清晰很多,而且效率也提高了些控乾。
——————————————————————————————————
對于arc屬性可能寫的不太清楚么介,這里附加點(diǎn):
1,不管在不在arc下蜕衡,object對象都有強(qiáng)引用壤短、弱引用之分,當(dāng)需要保持(擁有)其他對象的時候慨仿,需要retain久脯。
2,在arc中镰吆,使用strong桶现、weak修飾的變量,當(dāng)對象不再存在的時候會被置為nil鼎姊。而[align=-webkit-left]__unsafe_unretained不會被置為nil骡和,會成為野指針,是不安全的,再次訪問可能造成錯誤相寇。
轉(zhuǎn)自:http://www.cocoachina.com/bbs/read.PHP?tid=122591