创建一个临时变量 什么时候被释放

2020-05-20  本文已影响0人  无敌大闸蟹

面试的时候碰到有人问这个问题 这个问题实际是问的不是很严谨 实际是要区分arc和mrc
查阅相关资料之后 总结 也不一定对
首先要理解runloop和runloop的observer和休眠 还需要理解autoreleasepool
在autoreleasepool的源码中 有autoreleasepoolPush操作和autoreleasepoolPop操作 并且记录下了两个操作之间所有的autorelease对象的地址 autoreleasepoolPop实际是就是autoreleasepool的析构方法 相当于swift中的deinit
在autoreleasepoolPop操作中 会从后往前调用所有记录的对象的release方法
巧妙的是 runloop刚进入的时候也会调用autoreleasepoolPush操作
在休眠的时候也会调用 autoreleasepoolPop 和 autoreleasepoolPush操作 这就意味着 在runloop的两次休眠过程中 已经完成了类似autoreleasepool的内部逻辑 期间所有的autorelease对象已经被调用release方法 也就是计数器-1 所谓的临时变量的计数器也就为0 ====被释放

所有这道题如果现在让我来回答

 @autoreleasepool {
        NSObject *obj = [[NSObject alloc] init];
      //如果被autoreleasepool包裹 那么就是在这个autoreleasepool结束的时候释放的
    }

arc实际是就是llvm编译器+runtime llvm 编译器会自动插入retain release代码
如果在viewdidload的括号前 插入了[obj release]那就是出了这个方法就被释放
如果不是的话 就是在当前runloop下一次进入休眠或者退出的时候被释放

- (void)viewDidLoad {
    [super viewDidLoad];
   NSObject *obj = [[NSObject alloc] init];
  //类似于这种  
}
上一篇下一篇

猜你喜欢

热点阅读