2013-02-28 44 views
1

我遇到以下代码的问题,其中Xcode标记内存问题。警告在代码之下,在返回线上。有人知道为什么,我能做些什么吗?带有+0保留计数的对象返回给调用者,其中+1(拥有)保留计数是预期的 - 为什么?

- (id)copyWithZone:(NSZone *)zone 
{ 
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self]; 
    return [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; 
} 

Mvariable.m:177:2:用0对象保留计数返回到呼叫者其中1(拥有)保留计数预计
Mvariable.m:177:9:方法返回具有+0保留计数的Objective-C对象
Mvariable.m:177:2:使用+0保留计数返回给调用方的对象
Mvariable.m:177:2:具有+0保留计数的对象返回到呼叫者,其中+1(拥有)保留计数预计

回答

7

以“copy”,“create”,“new”,“alloc”或“retain”开头的方法必须返回一个已被保留的对象,即调用者必须释放它。

[NSKeyedUnarchiver unarchiveObjectWithData:archivedData]返回自动回复的对象。

请参阅:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

+3

请注意,使用归档来复制对象绝对不是典型的。与通常的做法相比,它也很慢。 – bbum 2013-02-28 21:00:51

+0

哦哇,我没有意识到一个方法名称的开始可以做到这一点,有多奇怪。感谢你的回答! – Tiago 2013-02-28 21:06:33

+0

在过去,它只是一个惯例,没有ARC,或者__strong和__weak的标记或者(__attribute __((ns_returns_autoreleased)))的句法甜味......所以我们必须保留以某种方式跟踪事物... – 2013-02-28 22:02:53

相关问题