我是那些使用[variable release]
和其他时间variable = nil
来清理记忆的人吗?
你什么时候使用每一个?有什么区别?
答案 0 :(得分:5)
variable = nil;
不会释放内存。如果self.property = nil;
将[self setProperty:nil];
释放内存,[variable release];
将释放内存,例如具有retain属性的合成属性。调用{{1}}将始终释放一个对象的引用。
答案 1 :(得分:2)
取决于“清理记忆”的含义。
release
是唯一可以释放alloc
分配的动态分配内存的东西。 alloc
应始终与某个地方release
或autorelease
的来电配对。
将varible设置为nil
并不一定释放任何内存(请参阅drawonward的回答),并且可能是内存泄漏的来源。
当您看到变量设置为nil
时,它是关于防止它在内存释放后意外使用(这可能导致崩溃)。虽然您可以在调用nil
后始终将变量设置为release
,但在实际需要时,这有点是风格问题。例如,您通常不会在类的nil
方法中看到变量设置为dealloc
,因为此时对象将无法再意外地滥用此类变量,因为它是被诅咒。
答案 2 :(得分:0)
如果属性设置为retain
,则这3个是等效的:
[self setProperty:nil];
self.property = nil;
[property release]; property = nil;
在每种情况下,对象都将被释放,然后设置为nil,这样就不允许从此开始对对象的所有访问。 “nilling”实例变量非常方便,因为它确保您只能在此上下文中释放一次对象,因为调用self.property = nil
两次将不会执行任何操作,但调用[property release]
将释放对象两次虽然你可能只保留一次。
大多数情况下,我发现保留属性最不容易出错,并且大部分时间都试图远离明确的retain
和release
来电。