永发信息网

ios 在哪里设置工程支持arc与否

答案:1  悬赏:70  手机版
解决时间 2021-01-11 10:58
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代码清晰很多,而且效率也提高了些。
转载
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
双丝光棉和丝光棉有什么区别
手机是否能上联通cbss系统和bss系统?
天猫送货入户服务可以预约时间吗
一般人xx的暑假作文250字
proe 如何去除零件参数
致青春2详细介绍,小说太长,简介太短,可以
汉庭酒店南昌上海路店停车场(出入口)地址在什
NBA中三秒区内的弧线是用来判定什么的?
在页面中引用了laydate插件,在显示的时候,
我从家走拿七千,七千花没了,运费是一万四,运
狗狗抗体检测要多少钱?
普通汽车大灯和透镜大灯有什么区别?
单选题西晋灭亡后,曾统一黄河流域的是A.刘裕
花生牛奶蛋糕地址在什么地方,我要处理点事!
我是个离婚的男人,认识一位离过两次婚的女人
推荐资讯
世界重大羽毛球赛事有哪些?
绵阳购二手房未满二年买方应缴那些税费
艺术展演,朗诵和什么结合好啊??
有没有乌鲁木齐的朋友给我推荐一下乌鲁木齐什
吃什么可以减掉腰腹部的赘肉?
没有电脑用手机怎么进192.168.10.1 路由器设
家里空调带不起来怎么办
读下图,据图中信息回答以下各题。1.上图反映
形状的形的部首是什么
黑曜石能被磁铁吸上吗?
黑芝麻,红糖,姜在一块妙一妙能止咳吗
处理高速违章的石祥路上那家去哪儿了
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?