2011-01-19 120 views
3

至于这个帖子: iPhone - dealloc - Release vs. niliOS内存管理跟进。 dealloc vs nil?

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

的解释如下:

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

  2. 是一个分配零到自我的属性栏,将在实践中发布的任何财产,目前保留。如果你有一个属性的自定义setter,那么应该这样做,它应该清除不仅仅是支持属性的实例变量。

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

例如,我在我的对象头设置一个私人VAR像这样:

SomeObject *oPointer; 

我不使用这个指针在头文件属性setter和它得到合成时,实例化目的。

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

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

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

[obj release]; 
obj = nil; 

毕竟是解释的问题是,为什么我还宣布与obj =零? [obj发布]调用似乎也杀死了指针。我在想,[OBJ发行]会取消分配它指向的内存,并且还设置OBJ为零所有在一杆,但现在看来,这也杀死指针,因为我的应用程序崩溃时,它试图引用OBJ[obj release];

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

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

提前致谢!

回答

3

调用释放将减少对obj的引用计数。如果引用计数变为0,那么它将被解除分配。指针obj仍然指向相同的内存位置,但访问它可能会导致程序崩溃。将obj设置为零并不是绝对必要的,但强化了obj不再有效的想法。在调试时,或者在程序后面,如果你想有选择地重新创建obj并使用“if(obj!= nil)”检查来确定它是否已经被创建,它会很有用。

如果你设置它保留作为一个属性,那么当它被称为是“self.obj = someObj中”,Objective C中会添加一个someObj中的引用计数。你不应该叫保留自己上通过的alloc-init建立的东西,因为ALLOC-INIT已经设置引用计数为1。如果你保留的对象,那么当它被释放时,引用计数只能回去1,这将成为内存泄漏。

3

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

obj = nil;obj指针设置为零。这是建议但不是必需的。如果你不这样做,而是继续使用obj指针,那么你很可能会意外地试图访问用于保存您在上面发布的对象的内存位置。如果该对象已被释放,则会导致崩溃或至少意外的行为。通过设置obj为零可以确保任何未来的obj使用将消息发送到零与该正常良好定义的行为。

0

释放的对象仍然指向同一个对象。我一直都做,荷兰国际集团的viewDidLoad中,以及在applicationDidFinishLaunching

4

无原因有两个最好:

  • nil是安全的,呼吁的方法,而已经公布的引用不是。

如果是retain属性,self.thinger = nil;也会调用release。如果没有,它不会。

  • 无论您使用retainassign属性是要保持干燥,这意味着你不希望有切换什么,但assign/retain标签和完成代码。在您的dealloc中使用release必须与属性保持同步。

如果使用autorelease严格,你几乎不必自行调用release除了在定制setter方法retain性能。

Check out the seminal article on NARC.自动释放是你的朋友。