发布,Dealloc和自我参考

Edw*_* An 33 null memory-management objective-c

所以我想我已经弄明白了所有这些问题.然后突然间我得到一个错误(崩溃)我无法弄清楚.然后在做了研究以纠正崩溃后,我注意到我认为我对这些关键区域的所有知识都有些错误.

以下是我要拍摄的8个问题,希望有人回答 - 这些问题的答案将极大地帮助我理解我的理解.提前谢谢!

Q1)如果该引用为零,是否可以在对象上调用Release?这应该是无害的,对吧?

Q2)如果该参考已被释放且参考计数为0,是否可以在对象上调用Release?

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

Q4)nil和NULL之间是否真的存在差异,或者只是通过浏览它来帮助读者/开发人员了解对象类型只是一个语义问题?

Q5)使用属性需要使用'Self'指针?

Q6)使用实例变量需要不使用'Self'指针?

Q7)我什么时候想要使用实例变量而不是其属性?我认为价值类型数据成员是好的,因为他们没有释放和保留参与.

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

Tom*_*ing 19

A1)[nil release]很好(不会做任何事情)

A2)否.请勿在取消分配后触摸物体.它们被释放后应设置为零.

A3)没有必要将释放的指针设置为nil,但是你会得到悬空指针(即,你无法分辨对象是否有效).将属性设置为nil通常用于释放底层的ivar,因此如果不这样做可能会导致内存泄漏

A4)nil和NULL均为零,因此在技术上是相同的.

A5)是的,你必须使用self.someProperty属性,就像你[self someProperty]只是一个方法一样

A6)self本质上是一个结构,所以你可以像这样访问ivars : self->someIvar. 但是,没有必要.

A7)当你不想因任何原因运行setter/getter方法时.当setter不允许nil值时我偶尔使用它,我需要释放变量

当释放被称为正确的次数时,自动调用A8)dealloc.你永远不应该直接调用dealloc(除了[super dealloc])


kpe*_*yua 11

你应该把这个问题分成几个不同的问题,但我会咬人.

  1. 是的,发送给nil的任何消息都是no-op.
  2. 否.引用计数为0的对象已经或即将被销毁,发送给它的任何消息都将导致崩溃,或者最多也会导致异常.
  3. 这取决于实际情况.如果你要发布内容-dealloc,那么可能不会.如果它是一个作用于特定方法的对象,那么可能不是.如果它是重复使用的ivar,我会说是的.在前两种情况下,如果不将指针设置为nil,则不会发生任何事情,因为您通常无法再访问这些指针.但在最后一种情况下,您仍然可以访问指向已释放内存的指针.如果您发送消息或尝试取消引用它,您的应用程序将崩溃.
  4. 它们都等于0.按惯例,nil它用于对象指针,并NULL用于任何其他指针,但混合它们不会导致任何问题.
  5. 如果要调用属性getter/setter,则为yes.如果你想访问ivar,它会直接封装(不常见),不.
  6. 不,您可以使用语法访问实例变量self->ivar.实际上,当您键入just时ivar,编译器会隐式添加self->解除引用.
  7. 不确定你的意思.
  8. 你唯一应该打电话-dealloc的时候是[super dealloc];用你自己的-dealloc方法打电话.对于任何其他对象,您应该始终只是打电话-release.


Pet*_*wis 8

其他人已经充分回答了1-6.

(7)Apple建议您直接在init和dealloc中使用实例变量.这主要是因为对象(特别是如果它是子类)在这两个方法中只是部分设置,因此如果它们有除了普通操作以外的任何东西,则调用setter/getter可能会导致错误的行为.一般来说,你可以安全地直接访问你的对象中的ivar(而不是通过getter),这样做会稍微有效(仅限于iPhone上的相关内容).通常,您应该在所有情况下使用setter,特别是如果您的对象可能是子类或其他人可能正在观察属性.

(8)你永远不会在dealloc方法中调用dealloc(除了[super dealloc]).如果您拥有另一个对象的所有权,那么您应该放弃该所有权(通过调用release或autorelease).然后,如果合适,系统将在对象上调用dealloc.但你永远不会自己打电话给dealloc.阅读内存管理规则(它只有9个段落,对于理解是至关重要的).