【问题标题】:XCode 5, analyser warningXCode 5,分析器警告
【发布时间】:2013-11-02 19:22:08
【问题描述】:

当我尝试分析 .m 时,我收到了奇怪的警告:

警告:具有 +0 保留计数的对象返回给调用者,其中 +1 (拥有)保留计数是预期的

上线

return [NSNumber numberWithInt:1];

代码是:

- (NSNumber*)index
{
  return [NSNumber numberWithInt:1];
}

带字符串的相似代码正确传递。

- (NSString*)ss
{
    return [NSString stringWithFormat:@"%d", 1];
}

我是否遗漏了 NSNumber 构造函数中的某些内容,或者是 Analyser 中的错误?

【问题讨论】:

  • 我无法使用您的代码重现警告。这是您的确切代码吗?你使用哪个 Xcode/SDK?将方法命名为 newIndex 会按预期导致该警告,但不会导致 index

标签: ios xcode xcode5


【解决方案1】:

在 Objective-C 方法中,命名对于确定它们的内存管理至关重要。

名称以allocnewcopymutableCopy 开头的方法应返回具有 +1 保留计数的对象,而其他所有对象都应返回自动释放的对象,即具有 +0 保留计数,如Advanced Memory Management Guide 中所述。

考虑到这一点,如果你的方法真的被命名为index,那么分析器就错了。


附带说明一下,您可以利用 Objective-C 文字来创建更简单的 NSNumber

[NSNumber numberWithInt:1]

可以替换为

@1

[NSNumber numberWithInt:anExpression];

可以替换为

@(anExpression)

【讨论】:

  • 你说得对。我的方法名称以“new”开头。因此分析器期望非自动释放的对象。
  • @IgorPchelko:请务必复制/粘贴您的实际代码,以免其他人浪费时间尝试解决不存在的问题。
【解决方案2】:

这看起来像是分析器中的一个错误,因为在这两种情况下都会返回一个自动释放的对象。

请注意,您可以使用新的@ 语法简化代码,如下所示:

- (NSNumber*)index
{
  return @1;
}

如果必须返回表达式,则需要括号,如下所示:

- (NSNumber*)index
{
  return @(value1 + value2); // Same as [NSNumber numberWithInt:value1 + value2];
}

【讨论】:

  • 返回@1; - 产生相同的警告。看起来这是分析器的错误。
  • @IgorPchelko 是的,这绝对看起来像分析器中的一个错误:index 不属于需要返回 +1 引用计数的method family,所以它不应该给你警告。
猜你喜欢
  • 1970-01-01
  • 2013-01-13
  • 2011-08-13
  • 2011-06-24
  • 1970-01-01
  • 2013-09-20
  • 2017-12-09
  • 1970-01-01
  • 2013-11-28
相关资源
最近更新 更多