【问题标题】:Can we do [self release];?我们可以做[自我释放];吗?
【发布时间】:2011-09-15 10:05:41
【问题描述】:

它可以工作...它不会崩溃,而且它似乎可以满足我的需要。

这可能是我的应用程序的设计缺陷,但它是满足我需要的最简单方法。基本上会显示一个视图,并且对象本身内的控件确定它何时从父视图中移除(此时需要释放它)。

此时最简单的方法是[self release],这似乎可行。

但是,我知道对象所有权,并且我知道实例化释放自身的对象并不是对象所有权的良好设计 - 即所有者类(实例化新对象的类)应该是释放它的一个。然而,这将要求我编写回调所有者类的委托方法,所有这些都只是为了释放对象。

请问有什么想法吗? :)

谢谢

【问题讨论】:

    标签: ios object release


    【解决方案1】:

    基本上显示一个视图,对象本身内的控件确定它何时从父视图中移除(此时需要释放它)。

    通常,父视图保留对子视图的引用,当它被删除时,该引用被释放。为什么要再次发布?

    如果您执行 [self release],则您正在从其他一些代码(保留对它的引用)中删除此对象的所有权。如果你这样做,那另一段代码仍然会有一个对垃圾内存的非零引用。在我看来,应该将这种情况通知另一段代码(然后它也可以自己发布版本)。

    一旦添加到超级视图中,我就可以发布了吗?

    代码示例中的pattern you usually see 是

    UIView *view = [[UIView alloc] initWithFrame...];
    [self addSubView:view];
    [view release];
    

    【讨论】:

    • 嗯,你说得很好。一旦添加到超级视图中,我就可以发布了吗?
    • 这就是通常的做法。问题是当您有一些其他对象(控制器)也需要引用子视图(它也需要保留)时。但即使你随后 [self release]'d,仍需要以某种方式通知该控制器,因为它现在具有对垃圾的引用。
    • 是的,@Thilo 是对的,这里的情况是他没有创建 UIView,他有一个 UIViewController 及其视图(它保留了!)
    【解决方案2】:

    如果您知道自己在做什么,并且您是自己班级的客户,那就没问题了。 关于成为一个糟糕的设计:你是对的。我建议通知正在实例化您要释放的类它已经消失,以便它可以释放它。您可以使用协议或 NSNotificationCenter。

    【讨论】:

      猜你喜欢
      • 2012-07-19
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多