iOS内存pipe理跟进。 dealloc vs nil?

关于这个post: iPhone – dealloc – 释放与无

1) [foo release]; 2) self.bar = nil; 

解释如下:

  1. 释放对象,通过实例variables访问它。 实例variables将成为一个悬挂指针。 这是dealloc中的首选方法。

  2. 将自己的属性栏分配给零,这将在实践中释放当前保留的任何财产。 如果你有一个属性的自定义setter,这应该清除不仅仅是支持属性的实例variables。

有人可以澄清#1的解释吗? 通过实例variables访问?

例如我已经在我的对象头中设置了一个私有variables,如下所示:

 SomeObject *oPointer; 

我没有在头文件中使用该指针的属性setter,并且在实例化对象时不会合成它。

在我的代码中,在给定的条件下,我稍后必须分配和指定它的对象的指针。

 obj = [[SomeObject alloc] initWith....]; 

所以现在通过实例variablesobj来访问。 我有一个UIButton被configuration为重置这个对象,它附加的方法释放它。 我通过这样做:

 [obj release]; obj = nil; 

毕竟这个问题的解释是,为什么我也必须声明obj = nil? [obj发布]调用似乎也杀死了指针。 我正在考虑[obj release]会释放它指向的内存,并且将obj全部设置为零,但似乎也会杀死指针,因为当[obj release]之后尝试引用obj时,应用程序崩溃;

这个问题有意义吗? 简单的解释是, [obj发布]是否进行全部清理,包括杀死指针,我需要知道这一点?

如果我为SomeObject指针设置一个retain属性,指针在发布之后是否仍然保留?

提前致谢!

调用release会减lessobj的引用计数。 如果引用计数为0,那么它将被释放。 指针obj仍指向相同的内存位置,但访问它可能会导致程序崩溃。 将obj设置为零并不是绝对必要的,但强化了obj不再有效的想法。 在debugging的时候,或者在程序的后面,如果你想有select地重新创buildobj,并使用“if(obj!= nil)”检查是否已经创build,那么这会很有用。

如果你在其上设置了retain作为一个属性,那么当它被称为“self.obj = someObj”时,Objective C将会向someObj的引用计数加1。 你不应该自己调用alloc-init创build的东西,因为alloc-init已经把引用计数设置为1.如果你保留了这个对象,那么当它被释放时,引用计数只会回到1,这将成为一个内存泄漏。

无,最好有两个原因:

  • nil可以安全地调用方法,而已经发布的引用不是。

如果是retain财产, self.thinger = nil; 也会叫释放。 如果没有,它不会。

  • 无论使用retain还是assign属性,都是要保留DRY的代码,这意味着您不必切换除assign/retain标记之外的任何内容并完成操作。 在dealloc中使用release必须和属性保持同步。

如果您严格使用autorelease ,几乎不需要自己调用release除非在自定义setter中retain属性。

查看NARC上的开创性文章。 Autorelease是你的朋友。

[obj release]; 减less对象obj指向的保留计数,并可能导致它被释放。 这并没有改变obj指针继续指向内存中的某个位置。

obj = nil;obj指针设置为nil。 这是build议,但不是必需的。 如果你不这样做,但继续使用obj指针,那么你可能会意外地尝试访问用于容纳上面释放的对象的内存位置。 如果该对象已被释放,则会导致崩溃或至less意外的行为。 通过设置obj为零,确保将来任何obj使用都会将消息发送到nil,并且具有正常的定义良好的行为。

释放对象仍然指向同一个对象。 我总是同时执行viewDidLoad和applicationDidFinishLaunching