Iphone 在将对象作为用户数据发送到NotificationCenter之前,是否需要自动释放该对象?

Iphone 在将对象作为用户数据发送到NotificationCenter之前,是否需要自动释放该对象?,iphone,cocoa,memory-management,nsnotifications,Iphone,Cocoa,Memory Management,Nsnotifications,我需要使用postNotificationName:object:userInfo:方法发布通知,并且我正在以userInfo的形式传递一个自定义类FileItem,以便在另一端获得它。我应该这样使用autorelease吗 FileItem *item = [[[FileItem alloc] init] autorelease]; [[NSNotificationCenter defaultCenter] postNotificationName:@"dataReceived" object

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

FileItem *item = [[[FileItem alloc] init] autorelease];
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataReceived" object:self userInfo:item];
[item release];
或者我可以只
alloc
,然后
将对象传递到默认通知中心后立即释放它吗

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

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

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

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

传统观点认为,对于每个
alloc
copy
retain
,您都需要相应的
释放(或
自动释放
)。做更多的事情几乎肯定会导致对象被过度释放。

autorelease
的意思是“稍后发送
release
”。向同一对象发送
autorelease
,然后再发送
release
,即释放它两次。正如马特·鲍尔所说,你的后一个例子和他的例子是等价的

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


不要释放其他对象拥有的对象,除非你也拥有它。

谢谢。我现在清楚多了。当我在.h文件中声明NSString*时,我经常会感到困惑,在dealloc方法中释放NSString*,但在init文件中没有alloc/copy/retain,只有类似stringObject=[NSString stringWithFormat@…];你能告诉我在这种情况下发生了什么吗?在这种情况下,你不应该在dealloc方法中释放字符串:No alloc/copy/retain,No release。但是,您可能需要这样做:stringObject=[[NSString stringWithFormat:@“…”]retain];然后在dealloc方法中释放stringObject。这确保了字符串在你准备好之前不会消失。对,没有alloc/copy/retain,没有所有权,没有发布。谢谢。我会将mutableCopy添加到需要最终释放的调用列表中。我可以看出释放已发送到自动释放池的对象可能会有多糟糕。谢谢你的解释。我想知道是否应该假设每次我向另一个对象发送消息时,我都应该假设该方法将保留它。一旦我传递了对象,我可以在下一行中释放它?你不应该关心其他对象是否会保留它。问题是:你拥有它吗?如果是,则保留或复制它。如果没有,你就没有。然后,稍后,你释放你拥有的。就这么简单。局部变量中的对象通常是您不拥有的对象;您可以将自己拥有的东西放入实例变量中,或放入实例变量中的集合对象中。