如何抑制Xcode Clang静态分析仪警告?

时间:2011-02-10 01:04:28

标签: objective-c xcode ios warnings clang

  

“在 n 上分配的对象的潜在泄漏并存储到'变量'中。”

通常这是一个非常有用的分析仪警告,但是在某些情况下我会产生令人烦恼的误报,我想抑制它以保持我的分析仪结果清洁。在分析仪的防御中,它注意到的肯定是内存泄漏,不是因为它在另一个执行路径中发布(它是盲目的)。

我会详细说明我的情况。它有各种风格,但一般模式如下:

  1. 分配了一个对象并设置了其委托。
  2. 对象完成了一些事情。 (任务开始,显示视图等)。
  3. 当前方法的执行结束。 (输入Clang警告)。
  4. 对象决定其任务完成,向委托发送消息。
  5. 委托发布对象。
  6. 这根本不是一种深奥的设计模式,所以我希望抑制是可能的。我知道可以通过将违规物品存放在稍后释放的静脉中来避免这种情况,但我更不希望添加伊塔尔污染。

3 个答案:

答案 0 :(得分:6)

Clang有一些新的Source Annotations。具体而言,您可能对ns_consumed属性感兴趣。

答案 1 :(得分:1)

我认为在这种情况下你应该注意静态分析器消息。你的模式有潜在的问题。

具体来说,当您从调用的方法返回到执行步骤5时,您处于可能已经解除分配的对象的方法中。我解释你的模式是这样的:

// steps 1, 2, 3
-(void) methodThatCreatesObject
{
    id theObj = [[TheObj alloc] init];
    [theObj setDelegate: delegateObj];
    // other stuff
}

请注意,上述内容违反了memory management rules

// step 4 - a method of theObj
-(void) someMethod
{
    [delegate notifyTaskCompleteFromObj: self];
    // self points to an invalid object here.  Doing anything with self results in EXC_BAD_ACCESS
}

以上内容违反了内存管理规则中的规定:

  

通常保证收到的对象在

中收到的方法中保持有效

如果我们说self是一个接收对象,从技术上来说,因为它是作为参数传递给堆栈的。

// step 5 the delegate method defined in the delegate object

-(void) notifyTaskCompleteFromObj: (TheObj*) anObj
{
    // do stuff
    [anObj release];
}

以上内容也违反了内存管理规则。

正常模式是拥有一个控制器,它拥有委托和拥有委托的对象(通常控制器本身就是委托)。我认为你应该采用这种模式。

答案 2 :(得分:0)

我发现了另一个有趣的选择。 OP给出了以下情形:

  1. 分配对象并设置其委托。
  2. 对象完成了一些事情。 (任务开始,显示视图等)。
  3. 当前方法的执行结束。 (输入Clang警告)。
  4. 对象决定其任务完成,向委托发送消息。
  5. 委托发布对象。
  6. 如果您只想将已分配对象的生命周期延长到分配/删除对象的生命周期,而不是显式版本,您可以这样做:

    TheObject* foo = [[TheObject alloc] init] autorelease];
    foo.delegate = self;
    [foo doSomething];
    objc_setAssociatedObject(self, foo, foo, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    return;
    

    通过将foo设置为具有保留策略的关联对象,委托(self)将有效地保留对象,该对象随后将释放委托(self)(稍后)。

    这并非OP所要求的,但它仍然是一种有用的模式,并且感觉它可能足以满足OP所呈现的情况。