Xcode静态分析器和copyWithZone

7
Xcode 4静态分析器将该方法标记为具有被过度释放的返回值,但似乎情况并非如此。
- (id)copyWithZone:(NSZone *)zone
{
    return [[[self class] allocWithZone:zone] initWithURL:self.url postString:self.postString];
}

有一个箭头从return关键字指向其后面的表达式,另一个箭头从该表达式指向分析器警告。以下是静态分析:
  1. 方法返回一个Objective-C对象,并具有+1个保留计数
  2. 发送了-autorelease消息的对象
  3. 将对象作为拥有引用(单个保留计数转移给调用者)返回给调用者
  4. 使用+0(非拥有)保留计数将对象返回给调用者
  5. 在期望+1(拥有)保留计数的情况下,将具有+0保留计数的对象返回给调用者
静态分析器是否不正确,还是这段代码存在问题?
根据请求,这是-initWithURL:postString:方法:
- (id)initWithURL:(NSURL *)u postString:(NSString *)p
{
    if ( (self = [super init]) ) 
    {
        self.url = u;
        self.postString = p;
    }
    return self;
}

即使清理和重新构建项目后,我仍然收到这个警告。

更新:在升级到Xcode 4.2后,Xcode静态分析器不再标记此问题。


@Jason:我刚刚使用上面的代码创建了一个新类,但是在 Xcode 4.0.2 中无法复制。当您单击“2.Object sent autorelease”分析时,哪个箭头会被突出显示? - spacehunt
@spacehunt:点击箭头没有任何反应。我创建了一个新项目并将.h/.m文件添加到其中,静态分析器没有发现任何问题。因此,我认为这一定是静态分析器中的 bug。 - titaniumdecoy
箭头和警告的截图怎么样?这个故事可能有一部分丢失了。 - Joshua Weinberg
另外,您正在运行哪个版本(确切地说)的XCode(并且是否安装了多个版本)? - Scott Corscadden
你的url和postString属性长什么样? - Morten Fast
显示剩余4条评论
1个回答

3
那是Xcode里的一个bug。代码本身没有问题。

这似乎是因为Xcode 4.2不再将此代码标记为问题。 - titaniumdecoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接