代码之家  ›  专栏  ›  技术社区  ›  Daniel Murali

通知时释放

  •  1
  • Daniel Murali  · 技术社区  · 14 年前

    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]];
    

    ?

    提前谢谢!

    2 回复  |  直到 10 年前
        1
  •  1
  •   walkytalky    14 年前

    编辑: 哦,错过了什么。我刚开始说的话仍然适用于一般情况, copy currentObject 新的 一点所有权——你马上就知道了 ,从而产生内存泄漏。

    因为我们看不到你在哪里创造 当前对象 ,这两个版本也有可能过度发布。但假设你 alloc 它,你已经足够释放了。但如果你坚持要打电话 当前对象 以及以后可能发生的事情——你需要 release 复制 呼叫 autorelease ,就像这样:

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

    如果这是不清楚的,有另一个良好的阅读 object ownership docs

        2
  •  0
  •   JeremyP    14 年前

    除非文档中另有说明,否则可以假设您传递对象的对象是为了解决它们自己与传入对象的所有权问题。例如,滚动到 NSNotificationCenter docs

    复制 把你的东西复制到字典里。因此,您拥有对象和副本,但从不释放副本(字典也保留副本)。如果希望词典包含对象的副本而不是对象本身,请执行以下操作:

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

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