两个片段有什么区别?
[myObj release];
和
[myObj release];
myObj = nil;
答案 0 :(得分:4)
如果您只是释放一个对象,那么它将成为释放对象。
如果您尝试对释放的对象执行任何类型的操作,那么您的应用程序崩溃。 为避免此类事故,始终首选“在释放后将对象指定为零”。因为我们都知道在nil上执行的任何操作都不会被执行:)
答案 1 :(得分:3)
这是内存管理中的一个很大的问题。如果您正在使用属性,那么您可以在不使用版本的情况下使用nil。因为属性的setter方法的工作原理如下:
- (void)setObjTypes:(NSArray *)ObjTypes {
[ObjTypes retain];
[_ObjTypes release];
_ObjTypes = ObjTypes;
}
setter增加传入变量的引用计数,减少旧实例变量的引用计数,然后将实例变量设置为传入变量。这样,只要设置了对象,对象就会正确地存储实例变量中存储的对象的引用计数。
setter方法自动应用release方法,然后用nil设置实例变量的值。但是如果你没有使用属性那么这是一个很好的经验,在设置nil之前我们必须首先设置release。如果我们设置一个指向nil的指针意味着它没有指向任何内存地址所以如果我们尝试使用上面的内存访问指针然后就会崩溃。如果我们在实例变量上调用release方法,那么它就会释放内存。
答案 2 :(得分:1)
不多。第二种形式只是防止您意外地尝试重用内存,就像它仍然是一个对象一样。 (好像它是相同的对象,确切地说。此后不久,内存地址很可能会重新用于新对象。)
答案 3 :(得分:1)
你必须小心第一个,因为在你释放之后,指针仍然指向一些带内存的内存,并且可以包含一些其他对象。 所以,在第一个中,如果你尝试[myObj release]然后[myObj doSomething],应用程序就会崩溃
我的建议是你在发布后应该总是把它设置为零。
答案 4 :(得分:0)
在对象上调用release时,引用计数递减。 当调用retain时,引用计数会递增。
所以这些人提到指针仍指向同一个地方。