Automatic Reference Counting
2024-09-07 10:43:03
NSObject简化版alloc:
struct obj_layout {
NSUInteger retained;
}; + (id)alloc { int size = sizeof(struct obj_layout) + 对象大小;
struct obj_layout *p = (struct obj_layout *)calloc(, size);
return (id)(p + );
}
(将引用计数保存在对象占用内存块头部的变量中是GNUstep的实现。而苹果的实现,则是保存在引用计数表中。引用计数表可以用hash表实现,表键值为内存块地址的散列值。)
retain方法使retained变量加1;
release方法使retained变量减1;
retainCount方法返回retained变量 + 1。
autorelease方法的本质就是调用NSAutoreleasePool对象的addObject类方法。
- (id)allocObject { id obj = [[NSObject alloc] init];
return obj;
} - (id)object { id obj = [[NSObject alloc] init];
[obj autorelease];
return obj;
} id obj1 = [obj0 allocObject];
id obj2 = [obj0 object];
obj1持有对象,obj2不持有对象。
(可以认为object方法对应一个NSAutoreleasePool。方法结束时,NSAutoreleasePool被废弃,pool内obj的release方法被调用。)
在ARC下,因为变量obj1和obj2都是强引用,所以都强持有新生成的对象。
强引用存在循环引用问题,可以使用弱引用来避免。
__weak修饰符注意点
弱引用失效时,会被置为nil。
(__unsafe_unretained失效时,不会被置为nil。)
id __weak obj = [[NSObject alloc] init];
// 自己生成并持有的对象不能继续为自己所有,所以生成的对象会立即被释放。__unsafe_unretained修饰符也同样。
__ autoreleasing用于对(id *)类型的参数传递.
最新文章
- Windows下打包Python的exe可执行文件
- 项目文件中含有两个config文件,app.config与app1.config,如何获取app1.config中的配置
- Yii框架第一步-- 安装
- inline-block 前世今生
- Careercup - Facebook面试题 - 6204973461274624
- DataGridView的DataGridViewComboBoxColumn列点击一次,自动处于编辑状态
- ARM备忘
- python codis集群客户端(一) - 基于客户端daemon探活与服务列表维护
- 卸载CentOS7-x64自带的OpenJDK并安装Sun的JDK7的方法
- 无用代码清除tip
- 微信小程序模拟点击出现问题解决方法
- Linux 清楚历史history命令的一个简单方法
- Java知多少(27)继承的概念与实现
- 实现CTreeCtrl父子节点的联动选择
- 神经网络出现nan原因?以及解决
- 基于Quartz.net的远程任务管理系统 一
- Tomcat9 配置在Windows7 64位 上安装步骤
- .NET CORE微服务实践
- Android Bitmap和Canvas学习笔记
- SQL Server 2016 特性和安装方法
热门文章
- tf.nn.max_pool 池化
- [译]谈谈SpringBoot 事件机制
- Bug Bash in Personal Photo Experience 1/11/2016
- golang slice 源码解读
- 如何将SqlServer配置为django的数据源(2.2以后版本)
- 5. iphone 的:active样式
- v&;n赛 ML 第一步(python解决)
- ATmega328P定时器详解
- ApiPost V3创事记:一个痛并快乐着的创业故事
- 使用NLP从文章中自动提取关键字