释放和释放后设置为nil之间的区别。

5
两个片段之间有什么区别?
[myObj release];

并且

[myObj release];
myObj = nil;
5个回答

4

如果你仅仅释放一个对象,那么它将变成已释放的对象。

如果你试图对已释放的对象进行任何操作,则你的应用程序会崩溃。为了避免这样的事故,在释放对象后总是更好地将其分配为nil。因为我们都知道对nil执行的任何操作都不会执行 :)


2
另外:当您使用合成的setter时,您无需先释放再将其设置为nil。将其设置为nil也会自动释放。 - Rengers
仅仅挑剔一下,如果您释放一个对象,它可能会被释放,而不是一定会被释放...所以经常情况下某些东西在一段时间内工作正常,但后来神秘地崩溃了。 - Kendall Helmstetter Gelner

2

内存管理是一个重要的问题。如果您使用属性,那么可以在不使用释放的情况下使用nil。因为属性的setter方法的工作原理如下:

- (void)setObjTypes:(NSArray *)ObjTypes {
    [ObjTypes retain];
    [_ObjTypes release];
    _ObjTypes = ObjTypes;
}

这些setter方法会增加传入变量的引用计数,减少旧实例变量的引用计数,然后将实例变量设置为传入变量。这样,只要对象被设置,它就正确地具有存储在实例变量中的对象的引用计数。

如果您没有使用属性,则setter方法会自动应用release方法,然后将实例变量的值设置为nil。但是,在设置nil之前,我们必须先设置release,这是一种很好的经验。如果我们将指针设置为nil,意味着它不指向任何内存地址,因此如果我们尝试使用上述指针访问该内存,则会导致崩溃。如果我们对实例变量调用release方法,则会释放内存。


1

没什么区别。第二种形式只是防止您意外地尝试将内存重复使用,就好像它仍然是一个对象一样。(确切地说,就好像它是相同的对象一样。该内存地址很可能会很快被重新用于新对象。)


1

在第一个中,你必须小心,因为释放后,指针仍然指向一些垃圾内存,并且可能包含其他对象。因此,在第一个中,如果你尝试 [myObj release] 然后 [myObj doSomething],应用程序可能会崩溃。

我的建议是,在释放后始终将其设置为 nil。


0

在对象上调用 release 时,引用计数会减少。 在调用 retain 时,引用计数会增加。

因此,正如大家所提到的那样,指针仍将指向同一位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接