博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Automatic Reference Counting
阅读量:6252 次
发布时间:2019-06-22

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

NSObject简化版alloc:

struct obj_layout {    NSUInteger retained;};+ (id)alloc {        int size = sizeof(struct obj_layout) + 对象大小;    struct obj_layout *p = (struct obj_layout *)calloc(1, size);    return (id)(p + 1);}

(将引用计数保存在对象占用内存块头部的变量中是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];
View Code

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

 

转载于:https://www.cnblogs.com/gattaca/p/5970954.html

你可能感兴趣的文章
struts2的坑以及tomcat的一些常识
查看>>
HDURevenge of Segment Tree(第二长的递增子序列)
查看>>
Json数组操作小记 及 JSON对象和字符串之间的相互转换
查看>>
Linux服务器时间相关命令记录
查看>>
常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服...
查看>>
视频支持拖动进度条播放的实现(基于nginx)
查看>>
图文详解AO打印(端桥模式)(转)
查看>>
安装 directx sdk 出现 S1023 解决
查看>>
BZOJ2037: [Sdoi2008]Sue的小球(区间DP)
查看>>
Git-命令行-删除本地和远程分支
查看>>
SUPERSOCKET.CLIENTENGINE 简单使用
查看>>
第 7 章 异步输入输出
查看>>
ASP.NET应用使用Nginx做负载均衡遇到的一个问题
查看>>
Chapter 5 Blood Type——5
查看>>
在JSON中遇到的一些坑
查看>>
本文将介绍“数据计算”环节中常用的三种分布式计算组件——Hadoop、Storm以及Spark。...
查看>>
C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用...
查看>>
35. 搜索插入位置
查看>>
go包之logrus显示日志文件与行号
查看>>
[AI开发]视频多目标跟踪高级版(离自动驾驶又‘近’了一点点)
查看>>