【问题标题】:Releasing while notifying通知时释放
【发布时间】:2010-07-08 14:13:41
【问题描述】:

我有一个对象

id currentObject;

我想通过通知。问题是我不知道如何正确释放它,内存管理文档让我发疯。

我现在正在这样做:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageReceived" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[currentObject copy], @"key", nil]];
[currentObject release];

应该是:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageReceived" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[currentObject autorelease], @"key", nil]];

?

(适用于iPhone,iOS4.0)

提前致谢!

【问题讨论】:

    标签: objective-c memory-management autorelease nsnotification


    【解决方案1】:

    任何一种方式都可以。尽管这两种方法之间存在细微差别,但在这种情况下不应产生任何实际差异。只要您以一种或另一种方式释放自己的所有权,就可以了。字典和通知中心将在自己的时间处理自己的所有权问题。

    编辑:糟糕,错过了一些东西。我起初所说的仍然普遍适用,在第一个示例中,您在 currentObject 上调用 copy。这会创建一个新的位所有权 - 您会立即忘记,因此会产生内存泄漏。

    由于我们看不到您创建 currentObject 的位置,因此这两个版本也可能过度发布。但是假设你 alloc 它,你已经充分释放了它。但是如果你坚持打电话给copy——这可能是不必要的,尽管你会更多地了解currentObject是什么以及以后会发生什么——你也需要release新副本,例如通过包装copy 打电话给autorelease,像这样:

    [[NSNotificationCenter defaultCenter] postNotificationName:@"MessageReceived" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[[currentObject copy] autorelease], @"key", nil]];
    [currentObject release];
    

    如果不清楚,请再次阅读object ownership docs

    【讨论】:

      【解决方案2】:

      除非文档另有说明,否则您可以假设您传递对象的对象是通过传入的对象解决它们自己的所有权问题。例如,滚动到NSNotificationCenter docs 概述的底部,就会发现它不保留观察者这一事实。

      您的第一个示例泄漏是因为您将对象的 副本 传递给由 -copy 创建的字典。所以你拥有对象和副本,但你永远不会释放副本(字典也保留副本)。如果您希望字典包含对象的副本而不是对象本身,请执行以下操作:

      [[NSNotificationCenter defaultCenter] 
          postNotificationName:@"MessageReceived" 
                        object:nil 
                      userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[[currentObject copy] autorelease], @"key", nil]];
      

      第二个例子很好,前提是您拥有 currentObject,即您使用 new、alloc 或包含 copy 的方法获得它,或者您之前保留了它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-27
        • 2013-10-10
        • 1970-01-01
        相关资源
        最近更新 更多