写点什么

Objective-C 中的自动引用计数

  • 2011-07-10
  • 本文字数:827 字

    阅读完需:约 3 分钟

近日,出现在 Clang 站点上的一篇文章探讨了对 Objective-C 中自动引用计数的需求。自动引用计数提供了一种类似于C++ auto 的服务,可以让对象自动参与到retain/release/autorelease 周期中而无需用户显示操纵对象。

Objective-C 使用了一种以约定为基础的引用计数。被持有的对象会被保留下来,这会增加其引用计数。当对象被释放时,其引用也会被释放。当保留的计数归零时,该对象就会被销毁。

为了使用工厂方法(会返回创建好的实例但却不会控制其生命周期的方法),Objective-C 提出了自动释放池的概念。他们是对象的局部栈列表,在处理循环结束时(通常是处理完事件队列中的某个事件时),该池就会被清空,这会减少列表中对象的引用计数。如果引用计数降为 0,那么对象就会被销毁。另一方面,如果对象还被循环处理中的其他代码所持有,那么该对象还可以供后续使用。

Objective-C 对于方法有一个非正式的命名约定以标识其用途。调用者希望能够控制诸如 init 与 new 所返回的对象。带有 with 的方法(如 NSString 的 stringWithFormat)会返回一个自动释放的对象。

Objective-C 2.0 向语言中添加了大量内容,如块与属性,他们具有自动的保持与释放语法。但借助于自动的引用计数,编译器现在可以推断出(这种情况数量不多,但应用却很广)应该在何处使用恰当的 retain/release 调用。

此外,如果编译器能够判明出在一对函数间的调用动作序列,那么就可以优化自动插入的 retain/release 调用。为了实现这一点,某些调用(如 init 与 new)就会被分配给类成员,这些新扩展可以给编译器一定的指示。但这么做的副作用就是调用未被注解的 init 方法时,如果他们没有响应正常的 init 方法行为,那么就会出现警告。

新的行为会在即将发布的 Clang 中得以实现,可以通过 -fobjc-arc 参数启用。内存受限的设备可以使用它来代替 Objective-C 的垃圾收集,而在桌面平台上则可以通过 -fobjc-gc 参数继续使用 Objective-C 的垃圾收集。

查看英文原文: Automatic Reference Counting in Objective-C

2011-07-10 15:012417
用户头像

发布了 88 篇内容, 共 273.6 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

Apache Druid 安装的时候进行 Java 版本校验没有输出

HoneyMoose

程序员必备技能之SpringBoot的自动装配原理,很详细,建议收藏!!!

AI乔治

Java spring 架构 微服务 springboot

Go语言:指针和unsafe.Pointer有什么区别?

微客鸟窝

Go 语言

C# BS方向 该如何规划学习?【学习路线指南】

Andy阿辉

C# 学习 编程 程序猿

架构实战营 模块三 作业

一雄

作业 架构实战营 模块三

企业架构师的职业发展

在天涯的海角

架构师 职业发展 企业架构师

这份Java面试八股文让329人成功进入大厂,堪称2021最强

北游学Java

Java 面试

使用Apache Spark构建可靠的数据湖(九)

Databri_AI

spark Data Lake iceberg Hudi

强强联手:2021强网杯LongTimeAgo复盘分析

网络安全学海

网络安全 信息安全 渗透测试 漏洞扫描 强网杯

Redis - 配置文件

旺仔大菜包

redis

详解轻量日志聚合系统Loki架构

运维研习社

Grafana 日志系统 Loki

架构实战营 - 模块 9- 作业

请弄脏我的身体

架构实战营

4种Spring Boot中集成Elasticsearch的方法实战

北游学Java

Java Spring Boot ES

细说节流(Throttle)和防抖(Debounce)

devpoint

防抖 节流 7月日更

Python OpenCV 图像的二值化操作再次学习与图像平滑处理(卷积处理)

梦想橡皮擦

Python 7月日更

Python 正则表达式急速入门

喵叔

7月日更

Vue进阶(十八):router.beforeEach 与 router.afterEach 钩子函数

No Silver Bullet

Vue 钩子函数 路由 7月日更

从家里到阿里,学弟求职的一年

程序员鱼皮

Java 数据库 redis 面试 求职

在线正则表达式可视化工具

入门小站

工具

Vue进阶(六):组件之间的数据传递

No Silver Bullet

Vue 组件 7月日更 数据传递

第九课作业

杰语

Java为什么用迭代器

卢卡多多

7月日更

[翻译] InnoDB 空间文件布局基础

keaper

MySQL 数据库 后端 服务端 innodb

[翻译] 使用 innodb_ruby 探索 InnoDB 的页面管理

keaper

MySQL 数据库 后端 服务端 innodb

Linux之grep命令

入门小站

Linux

Seldon 使用 (四):内置的推理服务TFServing

托内多

tensorflow kubeflow seldon tfserving

实战架构营模块三作业-外包学生管理系统架构设计

王晓宇

如何与同事相处

escray

学习 极客时间 朱赟的技术管理课 7月日更

[翻译] InnoDB 空间文件中的页面管理

keaper

MySQL 数据库 后端 服务端 innodb

golang学习之路--内存分配器

en

内存 Go 语言

JVM知识整理

十二万伏特皮卡丘

JVM

Objective-C中的自动引用计数_开源_Alex Blewitt_InfoQ精选文章