__weak弱引用并不持有对象,所以赋值给__weak修饰符的变量也不会改变计数器的值.

  

main.m

id __strong obj3 =
nil;

    id __weak obj1=
nil;

/*

id __weak obj1 = obj;

     编译器的模拟代码例如以下:

     id obj1;

     objc_iniitWeak(&obj1,obj);

     objc_destroyWeak(&obj1);

*/

    @autoreleasepool {

        id obj = [[NSObject
alloc] init];

        obj1 = obj;

        obj3 = obj;

        NSLog(@"%d",_objc_autoreleasePoolPrint());//在ARC机制下查看POOL池内的内容

        NSLog(@"obj retainCount = %ld",CFGetRetainCount((__bridge
CFTypeRef)obj));

        NSLog(@"obj1 retainCount = %ld",CFGetRetainCount((__bridge
CFTypeRef)obj1));

        NSLog(@"obj3 retainCount = %ld",CFGetRetainCount((__bridge
CFTypeRef)obj3));

    }

    NSLog(@"obj3 retainCount = %ld",CFGetRetainCount((__bridge
CFTypeRef)(obj3)));

    NSLog(@"obj1 retainCount = %ld",CFGetRetainCount((__bridge
CFTypeRef)(obj1)));

    NSLog(@"%d",_objc_autoreleasePoolPrint());

/*

打印例如以下:

objc[1029]: ##############

objc[1029]: AUTORELEASE POOLS for thread 0x7fff7455a300

objc[1029]: 1 releases pending.

objc[1029]: [0x101001000]  ................  PAGE  (hot) (cold)

objc[1029]: [0x101001038]  ################  POOL 0x101001038

objc[1029]: ##############

2015-07-24 23:02:39.686 Objective-C对象与core Foundation对象[1029:100223] 139077936

2015-07-24 23:02:39.687 Objective-C对象与core
Foundation
对象[1029:100223] obj retainCount = 2
-------->>>>>>>(1)

2015-07-24 23:02:39.688 Objective-C对象与core
Foundation
对象[1029:100223] obj1 retainCount = 3
-------->>>>>>>(2)

2015-07-24 23:02:39.688 Objective-C对象与core
Foundation
对象[1029:100223] obj3 retainCount = 2
-------->>>>>>>(1)

2015-07-24 23:02:39.688 Objective-C对象与core
Foundation
对象[1029:100223] obj3 retainCount = 1
-------->>>>>>>(3)

2015-07-24 23:02:39.688 Objective-C对象与core
Foundation
对象[1029:100223] obj1 retainCount = 2
-------->>>>>>>(4)

objc[1029]: ##############

objc[1029]: AUTORELEASE POOLS for thread 0x7fff7455a300

objc[1029]: 0 releases pending.

objc[1029]: [0x101001000]  ................  PAGE  (hot) (cold)

objc[1029]: ##############

2015-07-24 23:02:39.688 Objective-C对象与core Foundation对象[1029:100223] 139077936


*/

/*

1:由上面(1)可知__weak修饰符修饰的变量并不会持有对象

2:由(3)可知当__strong修饰的变量超出了作用域时,不在持有对象,导致rerainCout - 1;

3:细心的读者或许已经发现 obj1的retainCount和obj的不一样呢?(这也是笔者最大的疑惑)

以下介绍笔者的思考过程

(1)__weak修饰的变量尽管是对对象的弱引用,他不改变赋值对象(obj)的引用计数(retainCount),但自身的retainCount会添加. -------->>> 但是他们是指向同一个地址的,为何retainCount不一样呢?所以这条路不通

(2)尽管他们是同一个地址,但__weak不持有对象,但__weak修饰的变量想使用对象就必须使retainCount + 1,但同一时候并不改变对象的retainCount.带着这个疑问最后让我找到了答案 -->>在通过__weak指针寻找对象的时候,它有一个修饰词,当使用他的时候就会使返回的retainCount
+ 1(注意这里并非retainCount本身).

4:持不持有一个对象,是看它是否导致对象的retainCount
+ 1;而不是看他是否指向那个地址.

*/

iOS __weak学习碰到的疑问的更多相关文章

  1. IOS基础学习-2: UIButton

    IOS基础学习-2: UIButton   UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...

  2. iOS阶段学习第一天笔记(Mac终端的操作)

    前言部分 原本从事的是.NET开发,一直在要不要转iOS 中犹豫徘徊,经过复杂的内心挣扎终于鼓起勇气辞职脱产学习iOS;希望通过四个月的 学习后能够拿到理想的薪资.以下是学习过程中的学习笔记,为了方便 ...

  3. ios网络学习------4 UIWebView的加载本地数据的三种方式

    ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...

  4. ios网络学习------6 json格式数据的请求处理

    ios网络学习------6 json格式数据的请求处理 分类: IOS2014-06-30 20:33 471人阅读 评论(3) 收藏 举报 #import "MainViewContro ...

  5. iOS之学习资源收集--很好的IOS技术学习网站

    点击图片也能打开相关的网站: https://boxueio.com/skill/swift http://ios.b2mp.cn/ http://gold.xitu.io/welcome/?utm_ ...

  6. ios开发之OC基础-ios开发学习路线图

    本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...

  7. iOS手势学习UIGestureRecognizer & cocos2d 手势推荐

    iOS手势学习UIGestureRecognizer & cocos2d 手势推荐 手势识别类型: UILongPressGestureRecognizer  // 长按UIPanGestur ...

  8. 开源中国iOS客户端学习

    开源中国iOS客户端学习 续写前言 <开源中国iOS客户端学习>续写前系列博客    http://blog.csdn.net/column/details/xfzl-kykhd.html ...

  9. 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536

    原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45)   阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...

随机推荐

  1. [Javascript Crocks] Make your own functions safer by lifting them into a Maybe context

    You probably have functions that aren’t equipped to accept a Maybe as an argument. And in most cases ...

  2. android设置横屏和竖屏的方法

    方法一:在AndroidManifest.xml中配置 假设不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上androi ...

  3. 整数划分问题--DFS

    单点时限:1000ms 内存限制:256MB 描写叙述 Given two positive integers N and M, please divide N into several intege ...

  4. PHP经典项目案例-(一)博客管理系统5

    本篇实现发表博客. 八.发表博客 (1).界面实现file.php <tr>      <td colSpan=3 valign="baseline" style ...

  5. Modifying a Request or Response

    To make custom changes to web requests and responses, use FiddlerScript to add rules to Fiddler's On ...

  6. js forEach for区别

    1.循环中断差别 具体见示例代码: <!DOCTYPE html> <html lang="zh"> <head> <meta chars ...

  7. 【Oracle】(savepoint)保存点的使用

    作用 保存点可以回退到事务的一部分,我们在操作数据库的过程中可以对事务分隔为几个部分,在操作失误的时候就可以回滚到某个点即可. 实现步骤 我们现在新建一张表TMP003 )); 第一步:插入第一条记录 ...

  8. 1个比较简单的使用java反射机制获取前台数据进行数据封装的例子

    //利用反射机制 和 从request获取所有参数的形式来构建查询对象 CustomerChooseSearchParma searchObject = new CustomerChooseSearc ...

  9. webservice系统学习笔记1-使用注解创建ws服务

    简单入门之helloword,具体详细的在后面的章节详细介绍. 使用JDK自带的jax-ws创建并发布一个简单的webservice 在本地创建服务,然后本机访问 1.创建服务提供接口 IMyServ ...

  10. Opencv 实现图像的离散傅里叶变换(DFT)、卷积运算(相关滤波)

    我是做Tracking 的,对于速度要求非常高.发现傅里叶变换能够使用. 于是学习之. 核心: 最根本的一点就是将时域内的信号转移到频域里面.这样时域里的卷积能够转换为频域内的乘积! 在分析图像信号的 ...