使用objc_msgSend时避免静态分析器泄漏警告?

时间:2012-04-12 14:55:30

标签: objective-c automatic-ref-counting

我有来自通用工厂类的以下(简化)代码:

- (id) invokeSetup: (id) object {
    // Just an example, subclasses delegate setup to a component that either returns +0 or +1 references
    return objc_msgSend(object, @selector(init));
}

- (id) newInstance {
    id object = objc_msgSend([NSString class], @selector(alloc));
    id replacement = [self invokeSetup: object];

    return replacement;
}

分析器在return replacement:

上发出警告
  

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

我不知何故需要告诉分析器- invokeSetup返回的引用是+1。上面的例子是简化的,在实际程序中,有一些限制:

  1. 我无法使用ns_returns_retained注释invokeSetup,因为它是继承的,并且还有其他子类,其中invokeSetup返回+0引用。如果是+1或+ 0只能在运行时检测到。

  2. 我无法更改任何方法的名称。

  3. 设计就是这样。可能有更好的设计,但这里无法改变。

  4. 是否有可能以某种方式告诉ARC在分配(id replacement = ...)时,参考肯定是+1?

    谢谢, 约亨

1 个答案:

答案 0 :(得分:0)

请参阅https://stackoverflow.com/a/5833430/1313031了解抑制代码中静态分析器警告的方法

但是,最好的办法是重命名newInstance