objective-c内存管理问题

时间:2010-07-17 07:14:24

标签: iphone objective-c memory-management

我是那些使用[variable release]和其他时间variable = nil来清理记忆的人吗?

你什么时候使用每一个?有什么区别?

3 个答案:

答案 0 :(得分:5)

variable = nil;不会释放内存。如果self.property = nil;[self setProperty:nil];释放内存,[variable release];将释放内存,例如具有retain属性的合成属性。调用{{1}}将始终释放一个对象的引用。

答案 1 :(得分:2)

取决于“清理记忆”的含义。

release是唯一可以释放alloc分配的动态分配内存的东西。 alloc应始终与某个地方releaseautorelease的来电配对。

将varible设置为nil并不一定释放任何内存(请参阅drawonward的回答),并且可能是内存泄漏的来源。

当您看到变量设置为nil时,它是关于防止它在内存释放后意外使用(这可能导致崩溃)。虽然您可以在调用nil后始终将变量设置为release,但在实际需要时,这有点是风格问题。例如,您通常不会在类的nil方法中看到变量设置为dealloc,因为此时对象将无法再意外地滥用此类变量,因为它是被诅咒。

答案 2 :(得分:0)

如果属性设置为retain,则这3个是等效的:

  1. [self setProperty:nil];
  2. self.property = nil;
  3. [property release]; property = nil;
  4. 在每种情况下,对象都将被释放,然后设置为nil,这样就不允许从此开始对对象的所有访问。 “nilling”实例变量非常方便,因为它确保您只能在此上下文中释放一次对象,因为调用self.property = nil两次将不会执行任何操作,但调用[property release]将释放对象两次虽然你可能只保留一次。

    大多数情况下,我发现保留属性最不容易出错,并且大部分时间都试图远离明确的retainrelease来电。