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
你应该把这个问题分成几个不同的问题,但我会咬人.
-dealloc,那么可能不会.如果它是一个作用于特定方法的对象,那么可能不是.如果它是重复使用的ivar,我会说是的.在前两种情况下,如果不将指针设置为nil,则不会发生任何事情,因为您通常无法再访问这些指针.但在最后一种情况下,您仍然可以访问指向已释放内存的指针.如果您发送消息或尝试取消引用它,您的应用程序将崩溃.nil它用于对象指针,并NULL用于任何其他指针,但混合它们不会导致任何问题.self->ivar.实际上,当您键入just时ivar,编译器会隐式添加self->解除引用.-dealloc的时候是[super dealloc];用你自己的-dealloc方法打电话.对于任何其他对象,您应该始终只是打电话-release.其他人已经充分回答了1-6.
(7)Apple建议您直接在init和dealloc中使用实例变量.这主要是因为对象(特别是如果它是子类)在这两个方法中只是部分设置,因此如果它们有除了普通操作以外的任何东西,则调用setter/getter可能会导致错误的行为.一般来说,你可以安全地直接访问你的对象中的ivar(而不是通过getter),这样做会稍微有效(仅限于iPhone上的相关内容).通常,您应该在所有情况下使用setter,特别是如果您的对象可能是子类或其他人可能正在观察属性.
(8)你永远不会在dealloc方法中调用dealloc(除了[super dealloc]).如果您拥有另一个对象的所有权,那么您应该放弃该所有权(通过调用release或autorelease).然后,如果合适,系统将在对象上调用dealloc.但你永远不会自己打电话给dealloc.阅读内存管理规则(它只有9个段落,对于理解是至关重要的).
| 归档时间: |
|
| 查看次数: |
14928 次 |
| 最近记录: |