iOS中arc的设置与使用
2016-02-17 17:05
387 查看
项目中以前的一个复杂的想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
<
4000
/span>#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代码清晰很多,而且效率也提高了些。
附件:
PXISARC.h.zip (1
K)
社区原帖:http://www.cocoachina.com/bbs/read.php?tid=122591
(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
<
4000
/span>#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代码清晰很多,而且效率也提高了些。
附件:
PXISARC.h.zip (1
K)
社区原帖:http://www.cocoachina.com/bbs/read.php?tid=122591
相关文章推荐
- IOS如何使用LaunchImage
- ios 双指捏合放大缩小图片的例子
- IOS开发之不同版本适配问题2(#ifdef __IPHONE_7_0)
- 导航栏背景色改变
- QQ(iOS)客户端的粘性动画效果
- iOS 框架搭建过程1-欢迎页和引导页
- ios 之 Bonjour 协议简单抓包分析
- iOS深入学习(Block全面分析)
- 《转》IOS 扩展 (Extension)
- iOS 修改textView里面字的内边距
- iOS更改系统音量
- iOS:Crash文件解析
- iOS 7系列译文:忘记NSURLConnection,拥抱NSURLSession吧!
- iOS Google Analytics(谷歌分析)开发
- iOS将字符串转换为日期时间格式
- iOS-开发使用 iBeacon 的 iOS 7 应用
- iOS的AssetsLibrary框架访问所有相片
- iOS 图片缩放处理
- IOS-OC之高级控件TableView之二
- iOS技术博客