美文网首页
创建一个临时变量 什么时候被释放

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

作者: 无敌大闸蟹 | 来源:发表于2020-05-20 17:09 被阅读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];
      //类似于这种  
    }
    

    相关文章

      网友评论

          本文标题:创建一个临时变量 什么时候被释放

          本文链接:https://www.haomeiwen.com/subject/tmunohtx.html