美文网首页
oc中__weak修饰的变量引用对象会不会放入autorelea

oc中__weak修饰的变量引用对象会不会放入autorelea

作者: Light413 | 来源:发表于2022-11-16 00:31 被阅读0次

众所周知 weak修饰符可以使修饰的变量引用不改变原对象的引用计数,而且在对象释放时可以对变量设为nil;

我一直认为引用的对象也会放入自动释放池,因为我看的书就是这样说的:

所以当有人问题__weak修饰的变量引用对象会不会放入autoreleasepool?答案必须是肯定的。

其实__weak修饰的变量引用对象是不会放入autoreleasepool的;

先看__autoreleasing修饰的所引用对象

    @autoreleasepool {
        __autoreleasing id  objc = [[NSObject alloc]init];
        NSLog(@"\nobjc:%@",objc);
        _objc_autoreleasePoolPrint();
    }

__autoreleasing修饰肯定放入释放池的,所以打印此时池子的情况:

__autoreleasing.png
  • 可以看到在0x10480b040开始放入了目标对象objc;
  • 0x10480b000~0x10480b038 这56个字节存放自动释放池信息;
  • 0x10480b038~ 0x10480b040 释放池的哨兵对象占用1个字节;
  • 释放池里有两个对象;

所以__autoreleasing结果符合预期;

__weak修饰的所引用对象

    @autoreleasepool {
        __weak id  objc = [[NSObject alloc]init];
        NSLog(@"\nobjc:%@",objc);
        _objc_autoreleasePoolPrint();
    }
__weak.png
  • 可以看到目标对象objc随即释放;
  • 0x10480b000~0x10480b038 这56个字节存放自动释放池信息;
  • 0x10480b038~ 0x10480b040 释放池的哨兵对象占用1个字节;
  • 释放池里仅有1个所谓的哨兵对象;

稍微修改下:

    @autoreleasepool {
        __weak id  objc = [NSArray arrayWithObject:@1];
        NSLog(@"\nobjc:%@",objc);
        
        _objc_autoreleasePoolPrint();
    }

此时对象放了释放池,但是由于arrayWithObject方法返回的对象 会被添加到释放池,和有么有__weak修饰无关;

所以__weak修饰的变量引用对象不会放入自动释放池

相关文章

  • oc中__weak修饰的变量引用对象会不会放入autorelea

    众所周知 weak修饰符可以使修饰的变量引用不改变原对象的引用计数,而且在对象释放时可以对变量设为nil; 我一直...

  • OC中weak的原理

    简介:   weak是OC中用于打破对象间的循环引用的一种技术。1.weak修饰一个变量时,表示该指针变量可以使用...

  • __weak修饰符

    __weak修饰符 1.若有__weak修饰符变量所引用的对象被废弃,将nil赋值给该变量。2.使用__weak修...

  • iOS底层-- weak修饰对象存储原理

    问题:为何weak修饰的变量可以打破循环引用?因为weak修饰的变量存储在散列表中的弱引用表里,不参与引用计数器的...

  • weak和assign的区别

    使用weak和assign修饰OC对象的区别 相同点 不同点1.成员变量1.weak生成的成员变量是用__weak...

  • weak修饰符理解

    引言:weak在日常开发中其实挺常用的,weak所修饰的变量,在其所引用的对象被废弃时,会将nil赋值给变量。由于...

  • __weak简析

    弱引用在oc中被经常用到的,用__weak修饰的对象不会引用计数+1,不会被强引用。那么__weak是怎么做到的呢...

  • copy/strong/weak/assign的区别

    strong和weak 1.strong用来修饰对象,表示强引用,修饰的对象引用计数+12.weak同样用来修饰对...

  • __weak

    __ weak 1.若赋有 __ weak修饰符的变量所引用的对象被废弃是,则将nil赋值给该变量。2.使用有__...

  • 聊一聊weak

    1.聊一聊附有__weak修饰符的变量背添加到弱引用表,以及在弱引用表中删除的过程 附有__weak修饰符的变量,...

网友评论

      本文标题:oc中__weak修饰的变量引用对象会不会放入autorelea

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