【发布时间】:2010-05-11 09:51:28
【问题描述】:
两个sn-ps有什么区别?
[myObj release];
和
[myObj release];
myObj = nil;
【问题讨论】:
标签: iphone objective-c
两个sn-ps有什么区别?
[myObj release];
和
[myObj release];
myObj = nil;
【问题讨论】:
标签: iphone objective-c
如果你只是释放一个对象,那么它将成为释放的对象。
如果您尝试对已释放的对象执行任何类型的操作,您的应用就会崩溃。 为避免此类事故,始终首选“释放对象后将其分配为 nil”。因为我们都知道在 nil 上执行的任何操作都不会被执行:)
【讨论】:
这是内存管理中的一个大问题。如果您使用的是属性,那么您可以使用 nil 而不使用 release。因为一个属性的setter方法是这样工作的:
- (void)setObjTypes:(NSArray *)ObjTypes {
[ObjTypes retain];
[_ObjTypes release];
_ObjTypes = ObjTypes;
}
setter 增加传入变量的引用计数,减少旧实例变量的引用计数,然后将实例变量设置为传入变量。这样,只要设置了实例变量,对象就正确地拥有存储在实例变量中的对象的引用计数。
setter 方法自动应用 release 方法,然后将实例变量的值设置为 nil。但是如果你没有使用属性,那么在设置 nil 之前我们必须先设置 release 是一个很好的体验。如果我们设置一个指向 nil 的指针意味着它没有指向任何内存地址,所以如果我们尝试使用上面的方法访问该内存指针然后它将崩溃。如果我们在实例变量上调用 release 方法,那么它会释放内存。
【讨论】:
不多。第二种形式只是防止您意外地尝试重用内存,就好像它仍然是一个对象一样。 (准确地说,就好像它是 same 对象。内存地址很可能在此后不久被重新用于新对象。)
【讨论】:
你必须小心第一个,因为在你释放之后,指针仍然指向一些垃圾内存并且可以包含一些其他对象。 所以,在第一个中,如果你尝试 [myObj release] 然后 [myObj doSomething],应用程序可能会崩溃
我的建议是,你应该在发布后始终将它设置为 nil。
【讨论】:
在对象上调用 release 时,引用计数会减少。 当调用 retain 时,引用计数会增加。
所以正如他们提到的那样,指针仍然会指向同一个地方。
【讨论】: