发布的dealloc和自我参考(Release, Dealloc, and the Self ref

2019-06-27 08:34发布

所以我想我把所有这些问题都想通了。 然后,突然我得到一个错误(崩溃),我想不通。 然后做研究以弥补撞车后,我注意到,我想我知道这些关键领域是有些不对的一切。

下面是8个问题,我只是去回答别人的希望在那里拍摄 - 回答这些将极大地帮助我得到我的理解回到正轨。 由于时间提前!

Q1)是否可以调用释放对象如果引用是零? 这应该是无害的,对不对?

Q2)是否可以调用释放对象上如果参考已经发布,为0引用计数?

Q3)是否有必要设置为零的引用后释放呢? 如果你不将它设置为无会发生什么?

Q4)是否有真正的零和NULL之间的差异,或者是它只是一个语义的事情来帮助只是在它一眼读/开发者知道对象的类型?

Q5)使用性能要求使用“自我”的指针?

Q6)使用实例变量需要“自我”指针不使用?

Q7)当我会永远想用一个实例变量,而不是它的财产? 我想像值类型数据成员都还好,因为他们没有释放和保留参与。

Q8)是否有必要从的dealloc函数中调用对象的dealloc的? 在许多例子中我看到发行被称为,但不是dealloc的 - 是这样的教程不正确的?

Answer 1:

A1) [nil release]是罚款(什么都不会做)

他们已经被释放后A2)号请勿触摸对象。 他们被释放后,他们应设置为零。

A3),这是没有必要设置一个释放指针为零,但你得到悬摆指针(即,你不能告诉一个对象是否有效或无效)。 设置为零的特性经常被用来释放底层的伊娃,所以如果不这样做可能会导致内存泄漏

A4)零和NULL都为零,所以在技术上是相同的。

A5)是的,你必须使用self.someProperty的特性,就像你使用[self someProperty]如果这只是一个方法

A6)自我本质上是一个结构,这样你就可以访问像这样的ivars: self->someIvar 。 有没有必要,虽然。

A7)当你不希望运行无论出于何种原因的setter / getter方法。 我用它当ocassionally二传手不允许零值,我需要释放该变量

当释放调用次数进行正确的量A8)的dealloc被自动调用。 你永远不应该直接调用的dealloc(除了[超级的dealloc])



Answer 2:

你或许应该已经分裂了这个问题分成多个不同的问题,但我会咬。

  1. 是的,发送到无任何消息是一个空操作。
  2. 号为0的ref计数的对象曾经,或紧急的将被销毁,发送给它的任何消息将导致崩溃,或在最好的,一个例外。
  3. 这取决于实际情况。 如果你要发布的东西-dealloc ,那么可能不会。 如果它的范围限定于特定的方法,那么很可能不是一个对象。 如果它是被重用伊娃,我会说是的。 在前两种情况下,如果不设置指针为零,因为你通常将无法再访问这些指针什么也不会发生。 虽然在最后一种情况下,你仍然可以访问指针,它指向释放的内存。 如果你发送消息或尝试取消引用它,您的应用程序会崩溃。
  4. 他们都等于0。按照惯例nil用于对象指针, NULL用于任何其它指针,但混合起来也不会引起任何问题。
  5. 如果你想调用的属性getter / setter方法,那么是的。 如果您要访问的伊娃它直接封装(少见),无。
  6. 不,你可以访问使用语法实例变量self->ivar 。 事实上,当你键入只是ivar ,编译器暗中增加了self->解引用。
  7. 不知道你的意思在这里。
  8. 你应该调用的唯一时间-dealloc是打电话时, [super dealloc]; 在自己的-dealloc方法。 对于任何其他对象,你应该永远都只是调用-release


Answer 3:

其他已充分回答1-6。

(7),Apple建议您直接在您都init和dealloc的使用实例变量。 这主要是因为对象(特别是当它的子类)期间这两种方法都只是部分成立,并因此调用制定者/吸气可能会导致不正确的行为,如果他们有比微不足道的行为的任何其他。 一般来说,你可以放心地直接(而不是通过吸气)在访问对象的实例变量,它会稍多一些effecient这样做(只在iPhone上培训相关)。 一般来说,你应该使用二传手在所有情况下,特别是如果你的对象可以被继承,或者其他可观察的属性。

(8)你永远,永远,调用的dealloc(除了dealloc方法中的[超级的dealloc])。 如果您对另一个对象的所有权,那么你就应该放弃所有权(通过调用释放或自动释放)。 然后,系统将调用的dealloc如果合适的对象。 但你永远不会调用的dealloc自己。 阅读内存管理规则 (它只有9段落,至关重要的是要明白)。



Answer 4:

好。 我已经证实,没有设置B到零的伎俩。 所以,现在,我不创建B控制时(当我要找到它)检查零。

相反,我释放B,然后创建所述控制器,并将其分配给B.然后,在A的viewDidAppear方法,我释放B.

我相信,这个线程已经结束。 谢谢!



Answer 5:

A4),他们在他们的类型不同。 他们都是零,但NULL是一个void *,零是一个ID,并且是无类指针。



文章来源: Release, Dealloc, and the Self reference