0

wikipedia example author has released object stats,当它没有被分配、复制或保留时。这是一个错误还是我不明白的东西?

- (IBAction)analyzeDocument:(NSButton *)sender
{
  dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSDictionary *stats = [myDoc analyze];
    dispatch_async(dispatch_get_main_queue(), ^{
      [myModel setDict:stats];
      [myStatsView setNeedsDisplay:YES];
      [stats release];
    });
  });
}
4

3 回答 3

2

analyze将对象的所有权返回给调用者要么是错误,要么已被正确记录。如果不是stats发布的错误,则该代码示例使用的约定违反了Apple 的所有权内存管理规则。

内存管理规则,有时也称为所有权策略,可帮助您在 Objective-C 代码中显式管理内存。

您通过为它分配内存或复制它来拥有您创建的任何对象。
相关方法:alloc、allocWithZone:、copy、copyWithZone:、mutableCopy、mutableCopyWithZone:

另一个应该返回所有权的前缀是类方法+new。例如[MyDocClass newAnalysis];

于 2012-06-05T19:49:57.940 回答
2

这只是John Siracusa 编写的一个示例,用于演示 GCD 如何轻松地将长时间运行的任务置于后台,但是,是的,它有两个问题之一,一个是 ingored 约定,另一个是实际错误。

虚构的analyze方法可能会返回一个拥有引用。这违反了 Cocoa 约定,即未命名的方法new, alloc,releasecopy...通常返回此类引用,但如果文档明确说明它确实如此,并且真的没有办法绕过它,那可能没问题。在这种情况下,必须发送releasestats以避免内存泄漏。(如果这是真实的代码,重命名该方法将是一个好主意,也许create在 CoreFoundation 中使用 which 来表示拥有引用的返回。)

但是,如果analyze遵循约定并返回非拥有的引用,那么您是对的,发送releasestats是不正确的,最终会导致崩溃。

于 2012-06-05T19:51:03.617 回答
1

很可能analyze是返回一个保留计数为 1 的字典,这release就是需要它的原因。

于 2012-06-05T19:52:11.433 回答