【发布时间】:2010-07-17 07:14:24
【问题描述】:
我有人使用[variable release] 和其他时候使用variable = nil 来清理内存?
你什么时候使用每一个?有什么区别?
【问题讨论】:
标签: ios objective-c memory-management
我有人使用[variable release] 和其他时候使用variable = nil 来清理内存?
你什么时候使用每一个?有什么区别?
【问题讨论】:
标签: ios objective-c memory-management
variable = nil; 不会释放内存。如果[self setProperty:nil]; 会释放内存,self.property = nil; 将释放内存,例如具有保留属性的合成属性。调用[variable release]; 总是会释放一个对象的引用。
【讨论】:
取决于“清理内存”的含义。
release 是唯一释放由alloc 分配的动态分配内存的东西。 alloc 应始终与对 release 或 autorelease 某处的呼叫配对。
将变量设置为nil 不一定释放任何内存(请参阅drawonward 的答案),并且可能是内存泄漏的来源。
当您看到一个变量设置为nil 时,这是为了防止它在其内存被释放后被意外使用(这可能导致崩溃)。虽然您总是可以在调用release 后将变量设置为nil,但在实际需要时,这在某种程度上是一种风格问题。例如,您不会经常看到在类的 dealloc 方法中设置为 nil 的变量,因为到那时,对象将无法再意外误用此类变量,因为它正在被核武器攻击。
【讨论】:
如果一个属性设置为retain,那么这3个是等价的:
[self setProperty:nil];self.property = nil;[property release]; property = nil;在每种情况下,对象都会被释放,然后设置为 nil,这样从那时起对对象的所有访问都将不被允许。 “nilling”实例变量很方便,因为它确保您在此上下文中只能释放一次对象,因为调用 self.property = nil 两次第二次不会执行任何操作,但调用 [property release] 将释放对象两次,即使您可能只保留一次。
在大多数情况下,我发现让保留属性做自己的事情并尽量远离显式的 retain 和 release 调用最不容易出错。
【讨论】: