@autoreleasepool在ARC和MRC下的区别

@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 allocinitWithFormat:@”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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值