博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS ARC下内存管理使用非自己生成对象的相关问题
阅读量:4978 次
发布时间:2019-06-12

本文共 1598 字,大约阅读时间需要 5 分钟。

一、用于测试的自定义类
@interface CustomedObj:NSObject+ (instancetype) methodInit;@end@implementation CustomedObj+ (instancetype)methodInit {    CustomedObj *temp = [[CustomedObj alloc] init];    return temp;}- (void) print {    NSLog(@"==== Customed Object print");}- (void)dealloc {    NSLog(@"对象即将被析构");}@end
 
二、实验结论
      2.1  非自己生成的对象,即alloc/new/copy/mutableCopy以外的创建方法取得对象,并且赋值给非strong变量时,对象将会自动注册至autoreleasepool,从而不至于立刻被析构; (3.1)
      2.2  当赋值给给strong变量时,编译器作自动优化插入objc_retainAutoreleaseedReturnValue, 而不是插入retain,以避免注册至autoreleasePool.(3.3)
      2.3  访问weak变量时,将会把指向对象注册至autoreleasePool.(3.3)。另外,对weak变量再访问会再注册,访问几次则会注册几次,读者可自行验证。
 
三、实验代码
      3.1   非alloc/new/copy/mutableCopy获取对象,自动注册至autoreleasepool
__weak CustomedObj *weakRef = [CustomedObj methodInit];// 对象自动注册至autoreleasepool,执行完retainCount=1        [weakRef print];//执行完retainCount=1    }    NSLog(@"退出 autoreleasepool”);Log: ==== Customed Object print 对象即将被析构 退出 autoreleasepool

 

      3.2   alloc/new/copy/mutableCopy获取对象,不会自动注册至autoreleasepool,必须主动强持有以保证不被析构

__weak CustomedObj *weakRef = [[CustomedObj alloc] init];//编译警告,对象析构        [weakRef print]; // print消息将被发至nil    }    NSLog(@"退出 autoreleasepool”);LOG: 对象即将被析构 退出 autoreleasepool

 

      3.3   weak指针被访问时,如未注册,系统自动将对象注册至autoreleasepool,引用计数增加

CustomedObj *strongRef = [CustomedObj methodInit];//变量默认为__strong,因为编译器优化,将不会注册至autoreleasepool, retainCount=1        __weak CustomedObj *weakRef = strongRef;        [weakRef print];//调用weak指针会将对象注册到autoreleasepool,执行完retainCount=2    }    NSLog(@"退出 autoreleasepool");
LOG: ==== Customed Object print 对象即将被析构 退出 autoreleasepool

转载于:https://www.cnblogs.com/hushuai-ios/p/5165458.html

你可能感兴趣的文章
【Herding HDU - 4709 】【数学(利用叉乘计算三角形面积)】
查看>>
OPENSSL使用方法
查看>>
开发WINDOWS服务程序
查看>>
cross socket和msgpack的数据序列和还原
查看>>
解决跨操作系统平台JSON中文乱码问题
查看>>
前端利器躬行记(1)——npm
查看>>
前端利器躬行记(6)——Fiddler
查看>>
Intellij Idea新建web项目(转)
查看>>
用JAVA编写浏览器内核之实现javascript的document对象与内置方法
查看>>
centos iptables
查看>>
寻找二叉查找树中比指定值小的所有节点中最大的那个节点
查看>>
如何设置输入框达到只读效果
查看>>
RT3070 USB WIFI 在连接socket编程过程中问题总结
查看>>
MIS外汇平台荣获“2013年全球最佳STP外汇交易商”
查看>>
LeetCode 题解之Add Digits
查看>>
hdu1502 , Regular Words, dp,高精度加法
查看>>
SpringBoot在idea中的热部署配置
查看>>
MyEclipse连接SQL Server 2008数据库的操作方法
查看>>
JS验证图片格式和大小并预览
查看>>
laravel5.2 移植到新服务器上除了“/”路由 ,其它路由对应的页面显示报404错误(Object not found!)———新装的LAMP没有加载Rewrite模块...
查看>>