【问题标题】:Objective-C memory management: when do you use `[variable release]` vs `variable = nil` to clean up memory?Objective-C 内存管理:什么时候使用 `[variable release]` vs `variable = nil` 来清理内存?
【发布时间】:2010-07-17 07:14:24
【问题描述】:

我有人使用[variable release] 和其他时候使用variable = nil 来清理内存?

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

【问题讨论】:

    标签: ios objective-c memory-management


    【解决方案1】:

    variable = nil; 不会释放内存。如果[self setProperty:nil]; 会释放内存,self.property = nil; 将释放内存,例如具有保留属性的合成属性。调用[variable release]; 总是会释放一个对象的引用。

    【讨论】:

      【解决方案2】:

      取决于“清理内存”的含义。

      release 是唯一释放由alloc 分配的动态分配内存的东西。 alloc 应始终与对 releaseautorelease 某处的呼叫配对。

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

      当您看到一个变量设置为nil 时,这是为了防止它在其内存被释放后被意外使用(这可能导致崩溃)。虽然您总是可以在调用release 后将变量设置为nil,但在实际需要时,这在某种程度上是一种风格问题。例如,您不会经常看到在类的 dealloc 方法中设置为 nil 的变量,因为到那时,对象将无法再意外误用此类变量,因为它正在被核武器攻击。

      【讨论】:

        【解决方案3】:

        如果一个属性设置为retain,那么这3个是等价的:

        1. [self setProperty:nil];
        2. self.property = nil;
        3. [property release]; property = nil;

        在每种情况下,对象都会被释放,然后设置为 nil,这样从那时起对对象的所有访问都将不被允许。 “nilling”实例变量很方便,因为它确保您在此上下文中只能释放一次对象,因为调用 self.property = nil 两次第二次不会执行任何操作,但调用 [property release] 将释放对象两次,即使您可能只保留一次。

        在大多数情况下,我发现让保留属性做自己的事情并尽量远离显式的 retainrelease 调用最不容易出错。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多