MyClass *obj= [[MyClass alloc] init];
以下是两者之间的区别:
[obj release]; // Only obj own this object.
并且:
obj = nil;
当我将obj设置为nil时,iOS会自动释放它吗?
我有一个指针,有时我将其指向一个对象,有时不指向任何东西。因此,当我想要释放指针时,我必须检查它是否为nil吗?
MyClass *obj= [[MyClass alloc] init];
以下是两者之间的区别:
[obj release]; // Only obj own this object.
并且:
obj = nil;
当我将obj设置为nil时,iOS会自动释放它吗?
我有一个指针,有时我将其指向一个对象,有时不指向任何东西。因此,当我想要释放指针时,我必须检查它是否为nil吗?
今天,你必须使用 ARC。
Cheers
非常简短的答案是不要只是将其设置为nil。你必须释放它。将其设置为nil与释放它没有任何联系。你必须释放它。
然而值得记住的是如果它是一个属性,那么
self.obj = nil;
实际上,将会为你释放它。当然,你不能忘记"self."这部分!!!!
的确,
self.obj = anyNewValue;
使用[x release]释放内存,并将其设置为nil,确实可以帮助你释放旧的内存并清除所有内容,然后用新值进行设置。因此,self.obj = nil只是这种情况的特例,它释放和清除所有内容,然后仅将其保留为nil。
如果有人对内存感到新奇和完全困惑,请注意以下几点:
在将其设置为nil x=nil之前,必须先释放它[x release]。
如果您使用属性,请“不要忘记self.语法”。
如果您使用属性,只需说self.x=nil,或者确实self.x=somethingNew,它会处理释放和所有其他复杂烦人的东西。
最终,您将不得不学习所有关于释放、自动释放等的复杂知识。但是,人生苦短,现在暂时忘记它吧:- /
希望对某些人有所帮助。
obj = nil
将导致内存泄漏。
如果您想自动控制释放,应该做如下操作:obj = [[[NSObject alloc] init] autorelease]
(如果这样做,则不应释放它)。
自动释放池会在当前NSRunloop事件结束时自动释放对象。
NSRunloop会为每个事件迭代自动排空其NSAutoReleasePool,这通常非常有帮助。将一个对象设置为nil会创建一个内存泄漏(如果您通过alloc,retain或copy获取所有权),因为我们没有指向该特定内存位置的指针。
因此,如果您想dealloc一个对象,在将其设置为nil之前必须取出所有对该对象的所有权,方法是调用release方法。
[obj release];
obj=nil;