zoukankan      html  css  js  c++  java
  • @autoreleasepool在ARC和MRC下的区别

    MRC这个词应该是我编的,ARC,Automatic Reference Counting,手工引用计数就应该是:Manual Reference Counting,那就应该是MRC喽,不过没有见人这样用过。

    ARC引入了新的语句管理自动释放池语法:

    @autoreleasepool {
         // Code, such as a loop that creates a large number of temporary objects.
    }

    测试了一下,在ARC情况下和MRC情况下对象的释放有不同。

    比如,有这样的代码:

    #import <UIKit/UIKit.h>
    @interface ViewController : UIViewController{
        NSString *myString;
    }
    @end

    声明了一个myString成员变量。

    然后编写下面的代码:

    - (void)viewDidLoad

    {
        [super viewDidLoad];
        [self performSelector:@selector(test)];
        NSLog(@”myString: %@”,myString);
    }

    -(void)test{
        @autoreleasepool {
            NSString *string= [[NSString alloc] initWithFormat:@”First Name: %@”, @”tom”];
            NSLog(@”string: %@”,string);
            myString=string;
        }
    }

    该项目在ARC情况下日志结果:

    而在MRC情况下日志结果:

    哦,这里说一下怎么切换Xcode项目从ARC到MRC,先选中项目根结点:

    然后,在右侧:

    因为条目很多,可以在搜索框中输入arc,这样就可以看到下面标识的条目了。

    开始我以为@autoreleasepool等同于之前的NSAutoreleasePool类的api,只是起到语法糖的作用,节省了编写代码时间。上面的例子说明,只见还是有区别的。

    为此,我查询了clang的文档,找到目前能说服我的解释。

    这里简要介绍一下llvm和clang:

    • llvm,low level virtual machine,是底层编译库
    • clang,使用llvm底层库,编译器

    可以参考这篇中文文章了解:LLVM与Clang介绍

    下面解释一下在ARC和MRC中的不同处理:

      • ARC,将释放所有在@autorelesepool块中的对象,这就是为什么本文示例使用了默认修饰符(strong),相当于做了retain,也一样被释放的原因
      • MRC,在这种情况下@autorelesepool块等同于调用NSAutoreleasePool类的api
  • 相关阅读:
    MySQL Workbench的使用教程 (初级入门版)
    优化MySQL语句的十个建议
    Openfire+Spark+Spark Web安装配置(一)
    agsxmpp官方源代码
    (转载)Oracle中删除外键约束、禁用约束、启用约束
    8.手工备份恢复备用数据库(练习10、11)
    (转载)图文推荐给开发人员非常实用的站点
    13.服务器管理恢复RMAN备份(练习20)
    9.手工备份恢复表空间时间点恢复(练习12.13.14)
    12.服务器管理恢复RMAN配置(练习19)
  • 原文地址:https://www.cnblogs.com/guchengfengyun/p/4115461.html
Copyright © 2011-2022 走看看