ios中arc的设置与使用

http://www.cocoachina.com/bbs/simple/?t122591.html

项目中以前的一个复杂的想shi的类,今天leak测试的时候,发现收到内存警告,索性直接改为arc了
arc是iOS 5推出的新功能,iOS4.0引入的,那些概念性的话就不多说了).



总结一下新加入的property的关键字类型:

  • strong 和原来的retain比较相似,strong的property将对应__strong的指针,它将持有所指向的对象
  • weak 不持有所指向的对象,而且当所指对象销毁时能将自己置为nil,基本所有的outlet都应该用weak
  • unsafe_unretained 这就是原来的assign。当需要支持iOS4时需要用到这个关键字
  • copy 和原来基本一样..copy一个对象并且为其创建一个strong指针
  • assign 对于对象来说应该永远不用assign了,实在需要的话应该用unsafe_unretained代替(基本找不到这种时候,大部分assign应该都被weak替代)。但是对于基本类型比如int,float,BOOL这样的东西,还是要用assign。




发个小帖,仅供新手看~

旧工程配置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 allocinit]);
 //如果支持arctestArray就只是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。 3, 如果使用了arc, 在@property声明中,用 strong代替 retain。在支持
__unsafe_unretained的情况下,
__unsafe_unretained相当于assign。

4,如果使用了arc,NSAutoReleasePool也不能使用,测试发现,用 @autoreleasepool  代替,不会编译报错。

总之,一切你之前“背过”的那几条内存管理规则,你都不用去管了。而且,个人感觉,用arc代码清晰很多,而且效率也提高了些。



——————————————————————————————————

对于arc属性可能写的不太清楚,这里附加点:


1,不管在不在arc下,object对象都有强引用、弱引用之分,当需要保持(拥有)其他对象的时候,需要retain。
2,在arc中,使用strong、weak修饰的变量,当对象不再存在的时候会被置为nil。而[align=-webkit-left] __unsafe_unretained不会被置为nil,会成为野指针,是不安全的,再次访问可能造成错误。

[align=-webkit-left] 3,引用关键字:arc中,变量声明默认为_strong.

你可能感兴趣的:(ios中arc的设置与使用)