iOS __weak学习碰到的疑问
来源:互联网 发布:螃蟹秘密 知乎 编辑:程序博客网 时间:2024/06/05 11:18
__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 = [[NSObjectalloc] init];
obj1 = obj;
obj3 = obj;
NSLog(@"%d",_objc_autoreleasePoolPrint());//在ARC机制下查看POOL池内的内容
NSLog(@"obj retainCount = %ld",CFGetRetainCount((__bridgeCFTypeRef)obj));
NSLog(@"obj1 retainCount = %ld",CFGetRetainCount((__bridgeCFTypeRef)obj1));
NSLog(@"obj3 retainCount = %ld",CFGetRetainCount((__bridgeCFTypeRef)obj3));
}
NSLog(@"obj3 retainCount = %ld",CFGetRetainCount((__bridgeCFTypeRef)(obj3)));
NSLog(@"obj1 retainCount = %ld",CFGetRetainCount((__bridgeCFTypeRef)(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学习笔记29-__block 与 __weak的区别理解
- 【IOS学习】iOS——Block中 __block、__weak 、typeof、define等词的小解释
- iOS下的__block与__weak
- iOS __block和__weak的区别
- iOS学习之——__weak和__block
- 学习的疑问
- iOS - __weak&&__block
- ios __block与__weak
- iOS开发63-__block 和 __weak的区别
- [iOS]__weak与__block修饰符的区别
- iOS开发之 __block 与 __weak的区别理解
- 碰到的一些IOS兼容性问题
- 学习RMI的一些疑问
- Lua的Table学习疑问
- Akka学习过程的疑问
- 学习 spark 的一些疑问
- 学习时碰到的尴尬
- 35 岁前程序员要规划好的四件事
- java基础阶段总结
- Online Judge System For SzNOI 题库 语法百题 c++ d031
- 设计模式大全
- 初次试用CSDN-markdown编辑器
- iOS __weak学习碰到的疑问
- Online Judge System For SzNOI 题库 语法百题 c++ d032
- 哈希表算法
- Monkey测试黑白名单
- java中的12个原子操作类
- Online Judge System For SzNOI 题库 语法百题 c++ d033
- HDU 5301Buildings
- 剑指offer——斐波那契数列相关问题总结
- IAR 8.3以后的版本编译TI BLE Stack会报错