1

我有一个对象

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用)

提前致谢!

4

2 回答 2

1

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

编辑:哎呀,错过了一些东西。我起初所说的仍然普遍适用,在您调用的第一个示例copycurrentObject。这会创建一个的所有权——你会立即忘记它,因此会产生内存泄漏。

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

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

如果不清楚,请仔细阅读对象所有权文档

于 2010-07-08T14:27:30.653 回答
0

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

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

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

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

于 2010-07-08T15:43:08.900 回答