zoukankan      html  css  js  c++  java
  • 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代码清晰很多,而且效率也提高了些。

  • 相关阅读:
    FFmpeg在Linux下搭建 ***
    网络互联参考模型
    Linux的SOCKET编程详解
    [Python爬虫] 之四:Selenium 抓取微博数据
    [Python爬虫] 之三:Selenium 调用IEDriverServer 抓取数据
    [Python爬虫] 之二:Selenium 调用IEDriverServer打开IE浏览器安装配置
    Windows MongoDB安装配置
    windows10下部署IIS10+Django web服务
    [Python爬虫] 之一 : Selenium+Phantomjs动态获取网站数据信息
    windows10 phantomjs 安装和使用
  • 原文地址:https://www.cnblogs.com/ccguo/p/3420867.html
Copyright © 2011-2022 走看看