【问题标题】:Objective-C: Do you have to dealloc property objects before deallocating the parent object?Objective-C:在释放父对象之前是否必须释放属性对象?
【发布时间】:2011-03-16 11:25:30
【问题描述】:

假设我有一个名为“foo”的对象,另一个名为“bar”的对象作为属性。

当 "foo" 解除分配时,它会自动删除对 "bar" 的所有引用,以便 "bar" 也解除分配吗?或者“foo”会被释放,“bar”会漂浮在内存中的某个地方吗?即使所有“bar”的引用都在“foo”中定义。

提前致谢。

【问题讨论】:

    标签: iphone objective-c memory-management garbage-collection dealloc


    【解决方案1】:

    使用self.bar = nil 的主要原因是,如果 bar 是对在 nib 文件中创建的视图的引用。在这种情况下,可以在-(void)viewDidUnload 中包含该行,因为这将使系统在视图被洗牌时释放该对象。如果视图返回,它将通过 nib 文件重新加载。但是,这并不能避免在-(void) dealloc 中使用'self.bar = nil[bar release]

    【讨论】:

      【解决方案2】:

      如果foo 对象有任何保留或副本(感谢 Dave)bar,例如,当您将属性声明为其中之一时:

      @property (nonatomic, retain) NSString *bar;
      // Or
      @property (nonatomic, copy) NSString *bar;
      

      当你释放foo时,你需要释放bar

      - (void)dealloc
      {
          [bar release];
      
          [super dealloc];
      }
      

      系统不会为您释放 bar 的内存空间,直到您删除对它的所有引用(即引用计数降至 0),因此您必须自己监控引用计数和对象.

      【讨论】:

      • +1 如果属性声明为copy,您还必须释放。
      【解决方案3】:

      当对象 A 被释放时,它负责释放对其他对象(对象 B、对象 C 等)的任何引用——这不会自动发生。

      这是在对象的-dealloc 方法中完成的:

      - (void)dealloc 
      {
          [propertyB release];
          [propertyC release];
          [super dealloc];
      }
      

      (或者如果属性是读/写的并且设为retain,您可以替换[self setPropertyB:nil]等)。

      所以会发生的是,当对对象 A 的所有引用消失时,它会被释放,从而减少属性 B 和 C 的引用计数。如果这些对象仅由对象 A 拥有,那么它们也将结束结果被释放。

      (您标记的所有 iPhone OS 开发都是如此。我假设您不是在谈论 Mac 上的垃圾收集环境,它具有不同的规则和行为,并且会自动执行某些操作。)

      【讨论】:

        【解决方案4】:

        如果你分配内存,你必须释放它。所以,是的,在你的dealloc 中调用[bar release]self.bar = nil(如果你使用合成属性等等)。

        See here 了解 iOS 上的内存管理。

        【讨论】:

        • bar = nil 不会剪切它,您需要使用self.bar = nil[self setBar: nil] 来实际释放目标对象。但是,在-dealloc 中调用self 上的方法是个坏主意,因此请改为调用[bar release]
        • 是的,对不起,你是对的,self.bar = nil。 Apple 文档和示例代码经常使用 self.prop = nil... 但我大多同意。
        猜你喜欢
        • 2012-11-21
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 2011-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        相关资源
        最近更新 更多