繁体   English   中英

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

[英]iOS Memory Management followup. dealloc vs nil?

关于这个帖子: iPhone - dealloc - Release vs. nil

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

解释如下:

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

  2. 将nil分配给self上的属性栏,这将实际释放当前保留的属性。 如果你有一个属性的自定义setter,那么这样做,应该清理不仅仅是支持属性的实例变量。

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

例如,我在对象标题中设置了一个私有var,如下所示:

SomeObject *oPointer;

我不使用这个指针在头文件属性setter和实例化对象时,它不会合成。

在我的代码中,给定某些条件,我后来必须分配并将此指针指定给它的对象。

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

所以现在可以通过实例变量obj访问它。 我有一个UIButton配置为重置此对象它的附加方法deallocs它。 我这样做是通过:

[obj release];
obj = nil;

在解释了这个问题之后,为什么我还必须声明obj = nil? [obj release]调用似乎也杀了指针。 我认为[obj release]将释放它所指向的内存并且还将obj设置为nil all in one shot但它似乎也杀死了指针因为我的应用程序在[obj release]之后尝试引用obj时崩溃了;

这个问题有意义吗? 解释只是[obj release]做了所有清理,包括杀死指针,我需要注意这一点?

如果我为SomeObject指针设置了retain属性,那么指针在发布后仍会被保留?

提前致谢!

Nil是优选的,原因有两个:

  • nil可以安全地调用方法,而已释放的引用则不然。

如果它是一个retain属性, self.thinger = nil; 也将致电发布。 如果没有,它就不会。

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

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

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

调用释放将减少obj的引用计数。 如果引用计数变为0,则将其取消分配。 指针obj仍然指向相同的内存位置,但访问它可能会导致程序崩溃。 将obj设置为nil并非绝对必要,但强化了obj不再有效的观点。 它可以在调试时使用,或者稍后在程序中,如果您想要重新创建obj并使用“if(obj!= nil)”检查以查看它是否已经创建。

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

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

obj = nil; obj指针设置为nil。 这是推荐的,但不是必需的。 如果您不这样做但继续使用obj指针,那么您可能会意外地尝试访问用于保存上面释放的对象的内存位置。 如果该对象已被解除分配,则会导致崩溃或至少意外行为。 通过将obj设置为nil,您可以确保将来使用obj将消息发送到nil,并使用正常定义良好的行为。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM