4

我需要使用postNotificationName:object:userInfo:方法发布通知,并且我正在传递一个自定义类FileItemuserInfo以便我可以在另一端获取它。autorelease我应该这样使用吗

FileItem *item = [[[FileItem alloc] init] autorelease];
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataReceived" object:self userInfo:item];
[item release];

或者我可以在allocrelease对象传递到默认通知中心后立即将其传递给默认通知中心吗?

FileItem *item = [[FileItem alloc] init];
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataReceived" object:self userInfo:item];
[item release];

我试图在这里获得约定,因为我假设每当我将一个对象作为消息中的参数传递给另一个对象时,接收对象会在需要时进行保留,并且我可以安全地释放所述参数?

4

2 回答 2

3

第二个选项是正确的。您也可以执行以下操作:

FileItem *item = [[[FileItem alloc] init] autorelease];
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataReceived" object:self userInfo:item];

传统观念是,对于每一个alloc,copyretain,您都需要一个对应的release(or autorelease)。做更多的事情几乎肯定会导致你的对象被过度释放。

于 2009-06-04T03:26:56.277 回答
2

autorelease只是意味着“release稍后发送到这个”。发送autorelease然后release到同一个对象是释放它两次。正如马特鲍尔所说,你的后一个例子和他的例子是等价的。

更重要的是,你只释放你拥有的东西。一旦你释放它,你就不再拥有它,并且应该认为它不再是你的了。在您的第一个示例中,在第一个版本之后,您已停止拥有该对象。第二个版本显然是错误的,因为它释放了一个你不拥有的对象。

并且永远不要释放其他对象拥有的对象,除非您也拥有它。

于 2009-06-04T04:13:55.633 回答