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 *)类型的参数传递.

最新文章

  1. Windows下打包Python的exe可执行文件
  2. 项目文件中含有两个config文件,app.config与app1.config,如何获取app1.config中的配置
  3. Yii框架第一步-- 安装
  4. inline-block 前世今生
  5. Careercup - Facebook面试题 - 6204973461274624
  6. DataGridView的DataGridViewComboBoxColumn列点击一次,自动处于编辑状态
  7. ARM备忘
  8. python codis集群客户端(一) - 基于客户端daemon探活与服务列表维护
  9. 卸载CentOS7-x64自带的OpenJDK并安装Sun的JDK7的方法
  10. 无用代码清除tip
  11. 微信小程序模拟点击出现问题解决方法
  12. Linux 清楚历史history命令的一个简单方法
  13. Java知多少(27)继承的概念与实现
  14. 实现CTreeCtrl父子节点的联动选择
  15. 神经网络出现nan原因?以及解决
  16. 基于Quartz.net的远程任务管理系统 一
  17. Tomcat9 配置在Windows7 64位 上安装步骤
  18. .NET CORE微服务实践
  19. Android Bitmap和Canvas学习笔记
  20. SQL Server 2016 特性和安装方法

热门文章

  1. tf.nn.max_pool 池化
  2. [译]谈谈SpringBoot 事件机制
  3. Bug Bash in Personal Photo Experience 1/11/2016
  4. golang slice 源码解读
  5. 如何将SqlServer配置为django的数据源(2.2以后版本)
  6. 5. iphone 的:active样式
  7. v&n赛 ML 第一步(python解决)
  8. ATmega328P定时器详解
  9. ApiPost V3创事记:一个痛并快乐着的创业故事
  10. 使用NLP从文章中自动提取关键字