【问题标题】:NSMutableString and nil for memory managementNSMutableString 和 nil 用于内存管理
【发布时间】:2009-02-25 23:05:08
【问题描述】:

如果我有一个NSMutableString,例如

NSMutableString *foo = [[NSMutableString alloc] init];

如果我将对象 foo = nil 清零,是否会将保留计数降低 1,从而有效地释放内存?此时我是否需要从堆中重新分配 foo 才能使用它?

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

    请阅读the basic documentation。将变量 foo 设置为 nil 对其之前的内容没有任何影响。请记住,foo 只是一个指向对象的指针;要使用它,你必须让它指向一个有效的对象。只是让它不再指向该对象,并不会释放该对象。

    【讨论】:

    • OP 可能会将变量与属性混淆:如果 foo 是属性(不是变量),则设置 obj.foo = nil,将释放引用计数。
    【解决方案2】:

    将 nil 分配给变量不会影响先前存在的值。保留计数仅降低release

    您应该阅读 Apple 的 Cocoa memory management guidelines。 Cocoa 的引用计数系统并没有那么难,但它是你必须学习的东西,如果你没有正确地学习它,你的程序就会有很多微妙的 bug 让你发疯。

    【讨论】:

      【解决方案3】:

      上面说的都是真的。您需要在该代码 sn-p 中发布。

      但是,重要的是要记住,如果这样做是正确的,分配给 属性 会降低保留计数。那就是:

      foo = nil;         // doesn't lower
      bar.foo = nil;     // probably does
      

      属性看起来像普通变量,但实际上并非如此;他们智能地处理自己的内存管理。与他们合作时要牢记这一点。

      【讨论】:

      • “属性……智能地处理自己的内存管理。”当然,假设您正确地声明了它们。如果你用@property(assign) 声明它,它不会释放。
      • 这是真的,但假设是如果你用 (assign) 声明一个属性,它真的不应该被保留(例如,因为它是一个委托)。一般来说,您应该假设另一个类的属性正确管理其值的内存。
      【解决方案4】:
      是否会将保留计数降低 1,从而有效地释放内存?

      没有

      你应该使用

      [foo release]
      

      【讨论】:

        【解决方案5】:

        foo = nil; 不会降低对象的保留计数。它只会使foo 指向无处而不是对象。要减少保留计数,您必须说 [foo release];

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-28
          • 2011-06-12
          • 1970-01-01
          • 1970-01-01
          • 2016-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多