• iOS里面如何同时使用开启ARC的库 和 没有开启 ARC的库,ARC 与非 ARC同时存在的问题


    旧工程配置arc方案:

    1,直接在targets->build phases中修改compiler Flags,是否支持arc。添加:-fobjc-arc,就可以让旧项目支持arc。

    新工程配置arc方案,新工程里面使用ARC,但是使用旧的库没有使用arc:

    如果想让原来支持arc的不使用arc则添加-fno-objc-arc

    直接在targets->build phases中修改compiler Flags,

    这样以来,新旧工程的ARC适配问题就解决了。

    说明:在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代码清晰很多,而且效率也提高了些。

  • 相关阅读:
    使用jQuery操作DOM(ppt练习)
    使用jQuery操作dom(追加和删除样式-鼠标移入移出)练习
    Serializable接口
    过滤选择器(接上)
    内容过滤选择器
    基本过滤选择器
    IO流
    C语言打印100到200之间的素数
    续上篇结尾应用异或关系改变两个变量的值
    将两个整型变量的值互换的方法
  • 原文地址:https://www.cnblogs.com/ccguo/p/3420867.html
Copyright © 2020-2023  润新知