iOS __weak学习碰到的疑问
__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学习碰到的疑问的更多相关文章
- IOS基础学习-2: UIButton
IOS基础学习-2: UIButton UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...
- iOS阶段学习第一天笔记(Mac终端的操作)
前言部分 原本从事的是.NET开发,一直在要不要转iOS 中犹豫徘徊,经过复杂的内心挣扎终于鼓起勇气辞职脱产学习iOS;希望通过四个月的 学习后能够拿到理想的薪资.以下是学习过程中的学习笔记,为了方便 ...
- ios网络学习------4 UIWebView的加载本地数据的三种方式
ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...
- ios网络学习------6 json格式数据的请求处理
ios网络学习------6 json格式数据的请求处理 分类: IOS2014-06-30 20:33 471人阅读 评论(3) 收藏 举报 #import "MainViewContro ...
- iOS之学习资源收集--很好的IOS技术学习网站
点击图片也能打开相关的网站: https://boxueio.com/skill/swift http://ios.b2mp.cn/ http://gold.xitu.io/welcome/?utm_ ...
- ios开发之OC基础-ios开发学习路线图
本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录知识点关键字,把把握重点,然后再 ...
- iOS手势学习UIGestureRecognizer & cocos2d 手势推荐
iOS手势学习UIGestureRecognizer & cocos2d 手势推荐 手势识别类型: UILongPressGestureRecognizer // 长按UIPanGestur ...
- 开源中国iOS客户端学习
开源中国iOS客户端学习 续写前言 <开源中国iOS客户端学习>续写前系列博客 http://blog.csdn.net/column/details/xfzl-kykhd.html ...
- 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536
原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45) 阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...
随机推荐
- hdu4848 求到达每一个点总时间最短(sum[d[i]])。
開始的时候是暴力dfs+剪枝.怎么也不行.后来參考他人思想: 先求出每一个点之间的最短路(这样预处理之后的搜索就能够判重返回了).截肢还是关键:1最优性剪枝(尽量最优:眼下的状态+估计还有的最小时间& ...
- 火狐浏览器Firefox不支持alt怎么
因为HTML代码的解析不同,需要把标签文字"alt"换成"title",就可以在FireFox中正常显示了. 如下所示,IE对于alt和title均可以支持 但 ...
- Windows改桌面文件路径
默认的桌面和用户文件都是C盘,每次重装系统要备份,为了方便可以把它设置到其他盘符,一种方式是通过一些软件功能,如360有一个C盘搬家,也可以修改注册表文件: Windows Registry Edit ...
- -Prefix.pch has been modified 的错误修复
方法一: 选择 Product > Clean 然后重新编译--运行: 方法二: 找到-Prefix.pch文件,把中间的 #ifdef __OBJC__ #import <UIKit/U ...
- 微信小程序 - 反编译线上源码
github地址:https://github.com/qwerty472123/wxappUnpacker 不过我好像从来未成功过哈,TX地图+.TX公交都失败了 点击下载以上两个文件 哦,对了,你 ...
- Struts2(四)Action一接收参数
一.属性接收参数并输出 导入struts2的包,导入需要的包 和struts.xml配置文件 <?xml version="1.0" encoding="UTF-8 ...
- ADS中编译现存项目时常见错误:无法打开文件\…\…\2440init.o的解决办法
错误提示如下: 解决方法: 重新编译即可.
- iOS正則表達式(一)
什么是正則表達式? 正則表達式是对字符串操作的一种逻辑公式. 作用? 在iOS开发中我们通常使用正則表達式来匹配给定的字符串是否符合我们的业务逻辑,比方说用户注冊帐号仅仅能是手机号或者邮箱等.我们还能 ...
- 解决document.location.href下载文件时中文乱码
1:tomcat 安装路径下 找到 conf文件下的server.xml 2:<Connector port="8080" URIEncoding="utf-8&q ...
- isearch5 index,attribute和summary。
索引 isearch5 支持的索引分为:index,attribute和summary. Index指的是倒排索引,它存储了存储了从term到DocID的映射关系,形如: term-->(Doc ...