美文网首页将来跳槽用
iOS __weak对引用计数的影响

iOS __weak对引用计数的影响

作者: Sunxb | 来源:发表于2018-08-10 14:40 被阅读44次

问题:打印__weak修饰的变量,引用计数+1 ?

从一个例子入手吧

UIView * v = [[UIView alloc] init];
UIView * __weak v1 = v;
NSLog(@"retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(v)));
NSLog(@"retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(v1)));

我们初始化了一个view,并用v来指向它,然后在创建一个用__weak修饰的v1,跟v指向同一个内存空间。

按照我们的理解,打印v的引用计数是1,这个毫无疑问的,因为v1是使用__weak修饰,只有指向,但并不持有,所以按理说打印v1的引用计数应该也是1.

下面是结果

retain count = 1
retain count = 2

v1打印的引用计数竟然是2 ?

我查了查之后得出了结论:

当我们把__weak修饰的变量传进NSLog方法中打印,这个方法需要持有这个变量,为了安全起见嘛,如果不强引用一下,万一还没打印的被释放了呢 ? 所以会对v1调用objc_loadWeakRetained, 这时候v1的引用计数就会+1,在NSLog结束是,会调用objc_release, 然后引用计数-1。

为了辅证这个结论,我们可以把代码转成汇编来看一下。


然后我们直接搜索nslog,看第二个


确实是这个样子~ 那就不用多解释了 ~

相关文章

  • iOS __weak对引用计数的影响

    问题:打印__weak修饰的变量,引用计数+1 ? 从一个例子入手吧 我们初始化了一个view,并用v来指向它,然...

  • weak底层实现原理

    一、weak基本用法 weak是弱引用,用weak来修饰、描述所引用对象的计数器并不会加1,而且weak会在引用对...

  • iOS weak修饰属性的原理

    一、weak基本用法 weak是弱引用,用weak来修饰、描述所引用对象的计数器并不会加1,而且weak会在引用对...

  • iOS 内存管理 (4):Weak

    一、weak基本用法 weak是弱引用,用weak来修饰、描述所引用对象的计数器并不会加1,而且weak会在引用对...

  • iOS 深拷贝浅拷贝与@property 引用计数关键字Stro

    iOS 深拷贝浅拷贝与@property 引用计数关键字Strong,Copy,Weak,Assign iOS 深...

  • iOS基础 对Strong和Weak的理解

    之前对Strong和Weak的理解并不够深,只知道Strong是强引用,对象的引用计数加一,weak是弱引用,防止...

  • copy/strong/weak/assign的区别

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

  • iOS ARC中引用计数的实现

    iOS ARC中引用计数的实现iOS weak 的实现ARC中的数据结构以及寻址方式 一、 alloc alloc...

  • iOS weak 的实现

    iOS ARC中引用计数的实现iOS weak 的实现ARC中的数据结构以及寻址方式 SideTables 是一个...

  • iOS weak 原理

    一、weak 基本用法weak 是弱引用,用 weak 来修饰、描述所引用对象的计数器并不会增加,而且 weak ...

网友评论

    本文标题:iOS __weak对引用计数的影响

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