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