2010-07-11 73 views
3

我最近接受了一次Objective-C测试,看看我会怎么做。在dealloc和/或release上释放/释放对象吗?

原来我的分数并没有像我希望的那么好。这意味着更多的学习。

在测试过程中,有人问我这样一个问题:

你如何释放一个对象?

A. [obj dealloc]; B. [obj release]; C.以上都不是

我的选择是A,我不知道它是否正确。问题很混乱:不释放调用dealloc,因此达到相同的结果?

回答

7

No. release递减对象的引用计数。您可以直接拨打dealloc。调用release可减少引用计数,并在引用计数变为零时让运行时调用dealloc

+0

啊哈 - 有道理。谢谢 - 猜猜我错了! – 2010-07-11 20:27:08

+1

其实,释放你放弃对所有权的主张的信号,不多也不少。实际上,它通常意味着对象的保留计数将递减,但不总是例如在释放之前和之后检查一个常量字符串的保留计数。 – JeremyP 2010-07-12 13:06:15

0

是,release不会调用dealloc但只有递减引用计数且仅当引用计数去为零。该NSObject class referencerelease

"Decrements the receiver’s reference count." 

"The receiver is sent a dealloc message when its reference count reaches 0." 
+0

这并不意味着该版本会链接到dealloc的调用。 GC将通过参考检查发送该dealloc。只是想澄清。 – Jordan 2010-07-11 22:02:50

+1

GC永远不会发送'dealloc'。 – bbum 2010-07-11 23:01:04

+0

非GC环境如何?这就是我想的。 – progrmr 2010-07-12 17:33:37

0

我知道答案已经接受了这一点,但我无法抗拒加入我自己的想法。

测试问题的答案在技术上是C.您不释放对象,运行时认为它们不再使用时释放它们。

如果您在引用计数环境中释放对象,则表明您没有释放该对象,仅表示您放弃所有权声明。当没有人拥有所有权声明时,运行时会调用dealloc,并释放对象。同样,在垃圾收集环境中,当您覆盖引用时,您表示您不再对其感兴趣。一旦所有引用都消失了,在稍后的某个不确定的时间,finalize被发送到对象并释放对象。