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;而不是看他是否指向那个地址.

*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 20:47:06

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

11个超棒的iOS开发学习网站

11个超棒的iOS开发学习网站 原文:11 Insanely Great iOS Developers Sites永不止步地向他人学习 我相信,要想从一个"还不错"的人变成一个卓越的人,我们需要不停地向他人学习,同时还得尽早地适应最新的技术和工具.除了苹果官方文档网站之外,我列举了一些能获取有价值的文章和资源的网站,这些网站能够帮助我们更上一个台阶. 让我们先看一些原创内容博客: objc.io 这个网站由世界级的iOS工程师每月进行更新.上面可以看到关于某些话题的高质量文章和深度评论

ios学习笔记---ios完整学习路线

ios完整学习路线

ios开发学习资料总汇

ios开发学习资料总汇 下面是收集的一些学习资料. 1.唐巧精心整理了国内40多位iOS开发博主的博客地址列表 2.ios常见加密: 链接: http://pan.baidu.com/s/1eQTGFIE 密码: p8ay 3.

【iOS知识学习】_iOS动态改变TableView Cell高度

在做tableView的时候,我们有时候需要根据cell的高度动态来调整,最近在网上看到一段代码不错,跟大家Share一下. 在 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 类中获取cell的高度: CGSize boundSize = CGSizeMake(216, CGFLOAT_MAX); cell.textLabel.text

IOS开发学习笔记-(2)键盘控制,键盘类型设置,alert 对话框

一.关闭键盘,放弃第一响应者,处理思路有两种 ① 使用文本框的 Did End on Exit 绑定事件 ② UIControl on Touch 事件 都去操作 sender 的  resignFirstResponder #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UITextField *txtUserName; @pro

ios网络学习------11 原生API文件上传之断点续传思路

#import "MainViewController.h" @interface MainViewController () @end @implementation MainViewController - (void)viewDidLoad { [super viewDidLoad]; //下载文件 [self download]; } -(void)download { //1. NSURL NSURL *url = [NSURL URLWithString:@"ht

ios网络学习------8 xml格式数据的请求处理 用代码块封装

#pragma mark 加载xml - (void)loadXML { //获取网络数据. NSLog(@"load xml"); //从web服务器加载数据 NSString *str = @"http://www.baidu.com?format=xml"; //这里是乱写的 //1简历NSURL NSURL *url = [NSURL URLWithString:str]; //2建立NSURLRequest NSURLRequest *request =

iOS手势学习UIGestureRecognizer &amp; cocos2d 手势推荐

iOS手势学习UIGestureRecognizer & cocos2d 手势推荐 手势识别类型: UILongPressGestureRecognizer  // 长按UIPanGestureRecognizer  // 慢速拖动UIPinchGestureRecognizer  // 两指向內或向外拨动UIRotationGestureRecognizer   // 旋转UISwipeGestureRecognizer   // 快速滑动UITapGestureRecognizer   //

iOS深度学习 - Runtime

这里是iOS深度学习-Runtime的大纲. 一.Class 1,isa指针.super_class指针 2,metaclass(元类) 3,objc_object(表示一个 类的实例 的结构体) 和  id类型(typedef struct objc_object *id) 二.Ivar objc_setAssociatedObject 三.Method cache机制.SEL.IMP指针.Method Swizzling 四.Protocal objc_protocol_list 五.Cat