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

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

作者: 无敌大闸蟹 | 来源:发表于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];
  //类似于这种  
}

相关文章

  • iOS内存管理4-autorelease自动释放池

    临时变量什么时候释放自动释放池的原理自动释放池能否嵌套使用 使用xcode创建一个project在创建的时候有会生...

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

    面试的时候碰到有人问这个问题 这个问题实际是问的不是很严谨 实际是要区分arc和mrc查阅相关资料之后 总结 也...

  • iOS -@autoreleasepool的使用

    什么时候用@autoreleasepool for循环中创建了大量的临时变量得不到释放造成内存崩溃

  • 面试-- 内存管理for (int i = 0; i < 100

    什么时候需要手动创建自动释放池? 1、如果在循环中创建了大量的临时变量的时候需要在循环一开始就手动创建一个自动释放...

  • 内存面试题

    一、临时变量什么时候释放? 答:ARC环境,大括号结束时释放。MRC环境,在主线程中,临时变量会在runloop运...

  • iOS开发自动释放池(个人看法):

    自动释放池什么时候创建,什么时候销毁? 自动释放池什么时候创建,什么时候销毁? 自动释放池什么时候创建,什么时候销...

  • 话说 堆和栈

    栈(stack)区:栈是由编译器自动分配并释放,用户存放程序临时创建的局部变量,存放函数的参数值,局部变量等。也就...

  • 自动释放池工作原理

    自动释放池什么时候创建,什么时候销毁? 每一次运行循环执行后,也就是每当事件被触发时都会创建自动释放池。在...

  • 在for循环中, 大量创建相同的临时变量的问题

    在for循环中, 大量创建相同的临时变量的问题 在for循环中创建临时变量, 由于变量只有离开作用域的时候才会被释...

  • JNI创建变量和释放变量

    jni中的数据传递就两种:c层传到java层;java层传到c层。 1 当数据从java传递到c 1.1 传递基本...

网友评论

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

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