background image

#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 代替,
不会编译报错。