BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Objective-C中的自动引用计数

| 作者 Alex Blewitt 关注 4 他的粉丝 ,译者 张龙 关注 12 他的粉丝 发布于 2011年7月11日. 估计阅读时间: 2 分钟 | 如何结合区块链技术,帮助企业降本增效?让我们深度了解几个成功的案例。

近日,出现在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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT