Objective c 使用objc_msgSend时避免静态分析仪泄漏警告?

Objective c 使用objc_msgSend时避免静态分析仪泄漏警告?,objective-c,automatic-ref-counting,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 =

我从通用工厂类中获得了以下(简化)代码:

- (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;
}
分析仪在返回替换时产生警告::

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

我需要告诉分析器,
-invokeSetup
返回的引用是+1。上述示例已简化,在实际程序中,有几个约束条件:

  • 我不能用保留的ns_returns_注释
    invokeSetup
    ,因为它是继承的,还有其他子类invokeSetup返回+0引用。如果是+1或+0,则只能在运行时检测到

  • 我无法更改任何方法的名称

  • 设计就是这样。也许会有更好的设计,但这不能在这里改变

  • 是否有可能在赋值点(
    id replacement=…
    )以某种方式告诉ARC该引用肯定是+1

    谢谢, Jochen

    有关在代码中抑制静态分析器警告的方法,请参阅


    但是是的,最好的办法是重命名newInstance,我知道你说这是一个例子,但是为什么工厂模式试图重新发明/替换
    alloc&init
    ?为什么
    init
    有时会返回retained
    alloc
    应仅返回retained,否则创建时某些对象的retain计数为,而其他对象的retain计数为2。如果它不是ARC,那么它将导致代码看起来像
    NSString*s=[@“test”newInstance];[s释放];[s释放]。虽然你不能改变它,但你还是可以避免它吗?基本上,你设置的约束排除了所有可能的解决方案,对不起。嗯,我并不抱歉,实际上,这看起来是一段非常糟糕的代码。实际上最好的办法是重写代码,使其不那么糟糕。他有一个方法,根据使用的是哪个类或子类,它具有不同的所有权语义。用这个写一个稳定的系统是没有希望的。对不起。更名只会让生活变得更糟。这是arc旨在防止的设计类型。如果您一直使用此代码,那么上面的链接或-fno objc arc将隐藏警告,但您仍然会使用此设计。