Objective-C关于非ARC模式下的对象引用计数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Objective-C关于非ARC模式下的对象引用计数相关的知识,希望对你有一定的参考价值。
Objective-C是一门简洁、强大、灵活的既具有面向对象特性也具有函数式编程特性的编程语言。由于它是C语言的马甲,也就是说,Objective-C可以将其源代码先转为纯C语言然后再编译为最终的目标代码,所以我们也可以用它来写纯C语言代码,它与C是完全兼容的!(这点与C++在语法特性上跟C语言兼容的特性不同)
由于有不少Objective-C爱好者对于ARC模式下的Objective-C感到十分困惑,所以希望能深入了解一下传统非ARC模式下的编程法则。通过对非ARC模式Objective-C工作模式的认知,我们甚至可以对整个Cocoa Framework的运行核心做更深层的认知。为何我不推荐使用ARC模式呢?
你用了ARC就得去记__strong、__weak、__unsafe_unretained、__autoreleasing、__bridge等等杂七杂八的关键字~这些乱七八糟的概念本身会把你搞晕,而且当你半懂不懂的时候一旦乱用反而会产生各种奇怪的bug~这些玩意儿倘若充斥在你的代码中,一来很丑,二来对于一些新手很容易被弄晕……所以说,ARC这货自其出生就带来了许多灾难!
而反观传统的非ARC模式,property就一个assign,一个retain,NSObject里就调用retain/release和autorelease方法~而且Apple对此的规则也非常简单——“不是你创建的就不需要你释放;是你创建的你才去释放它。”这一句话就能解决所有问题~
除此之外,无论你用ARC还是非ARC,你都需要搞懂Apple Cocoa Framework的消息循环机制,即autorelease是如何工作的。否则你的assign或weak属性的Objective-C对象啥时候被释放也都不会知晓~
综上所述,如果为了编程方便、可维护、可扩展,我们完全可以把ARC编译选项给关掉!另外,在Objective-C中往往把“方法调用”阐述为“消息发送”。比如[obj msg]一般大家描述为obj对象调用其msg成员方法。而正式用语上应该描述为向obj对象发送msg消息。在哪个对象的方法里执行这条语句的,那么称该对象为消息发送者;msg称为消息(即方法);obj则称为消息接收者。讲了那么多,下面开始切入正题!
在基于Foundation/Cocoa Framework的Objective-C中,我们定义一个类往往需要继承NSObject这一Foundation的基类。当我们调用NSObject的alloc类方法时,就会给要创建的对象分配存储空间;然后紧接着调用NSObject的init成员方法对创建的对象做初始化。这里就会对此对象做引用计数设置为1的操作。在基于Foundation/Cocoa Framework的Objective-C与传统的C++不同,它全面通过为每一对象指定引用计数来确定其生命周期。当某个对象的引用计数被减到0时,会触发调用该对象的dealloc成员方法。而上述的init方法就已经把对象的引用计数设置为1了。当我们调用NSObject的release成员方法时,该对象的引用计数减1。当我们调用NSObject的retain成员方法时,该对象的引用计数加1。通常,我们不要自己去重写NSObject的release与retain成员方法
以上是关于Objective-C关于非ARC模式下的对象引用计数的主要内容,如果未能解决你的问题,请参考以下文章
当没有其他引用保留对象时,如何将 id 对象安全地存储在 ARC 下的 C++ void* 成员中?
什么会导致块在 ARC 下不保留引用的 Objective-C 对象?