发行,解除分配和自我参考 [英] Release, Dealloc, and the Self reference

查看:71
本文介绍了发行,解除分配和自我参考的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我想我已经解决了所有这些问题.然后突然我得到一个错误(崩溃),我无法弄清楚.然后,在进行了研究以纠正事故之后,我注意到我以为我知道的关于这些关键区域的所有信息都有些错误.

以下是我要向那里提出的8个问题,希望有人回答-这些问题的答案将极大地帮助我重新理解自己的理解.提前谢谢!

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

Q2)如果该引用已经释放并且引用计数为0,可以在对象上调用Release吗?

Q3)释放后是否有必要将引用设置为nil?如果不将其设置为nil,会发生什么?

Q4)nil和NULL之间真的有区别吗,还是只是通过语义知识帮助读者/开发人员了解对象类型?

Q5)使用属性需要使用自"指针吗?

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

Q7)我什么时候想使用实例变量代替其属性?我想值类型数据成员还可以,因为它们没有释放并保持参与状态.

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

解决方案

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

A2)否.释放对象后请勿触摸.释放它们后,应将它们设置为nil.

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]除外)

So I thought I had all these questions all figured out. Then all of a sudden I get an error (a crash) I can't figure out. Then after doing research to remedy the crash, I notice everything that I thought I knew about these critical areas are somewhat wrong.

Below are 8 questions I am just going to shoot out there in hopes of somebody answering - the answers to these will greatly help me get my understanding back on track. Thanks ahead of time!

Q1) Is it okay to call Release on an object if that reference is nil? This should be harmless, right?

Q2) Is it okay to call Release on an object if that reference has been released and as a reference count of 0?

Q3) Is it necessary to set a reference to nil AFTER releasing it? What happens if you dont set it to nil?

Q4) Is there really a difference between nil and NULL, or is it just a semantic thing to help the reader/developer know the object type just by glancing at it?

Q5) Using properties REQUIRE the use of the 'Self' pointer?

Q6) Using instance variables requires that the 'Self' pointer is NOT used?

Q7) When would I ever want to use an instance variable instead of its property? I'd imagine value type data members are okay since their is not releasing and retaining involved.

Q8) Is it necessary to call an object's dealloc from within the dealloc function? In many examples I have seen Release being called, but not Dealloc - are such tutorials incorrect?

解决方案

A1) [nil release] is fine (won't do anything)

A2) No. Don't touch objects after they've been deallocated. They should be set to nil after they are released.

A3) It's not necessary to set a released pointer to nil, but you get dangling pointers (i.e., you can't tell if an object is valid or not). Setting a property to nil is often used to release the underlying ivar, so failing to do this can cause a memory leak

A4) nil and NULL are both zero, so are technically the same.

A5) Yes, you must use self.someProperty for properties, just as you would use [self someProperty] if it was just a method

A6) self is essentially a struct, so you can access ivars like so: self->someIvar. There is no need to, though.

A7) When you don't want to run the setter/getter methods for whatever reason. I use it ocassionally when the setter doesn't allow nil values, and I need to release the variable

A8) dealloc is called automatically when release is called the correct amount of times. You should never call dealloc directly (except for [super dealloc])

这篇关于发行,解除分配和自我参考的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆