0

ジェネリック ファクトリ クラスからの次の (簡略化された) コードがあります。

- (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:

警告: +1 (所有) 保持カウントが予期される呼び出し元に +0 保持カウントを持つオブジェクトが返されました

- invokeSetupによって返される参照が +1であることをアナライザーに伝える必要があります。上記の例は簡略化されており、実際のプログラムにはいくつかの制約があります。

  1. invokeSetup継承されているため、ns_returns_retained で注釈を付けることはできません。また、invokeSetup が +0 参照を返す他のサブクラスがあるためです。+1 または +0 の場合、実行時にのみ検出できます。

  2. メソッドの名前を変更することはできません。

  3. デザインはそのままです。より良いデザインがあるかもしれませんが、ここでは変更できません。

id replacement = ...参照が確実に +1 であることを割り当て ( ) の時点で何らかの方法で ARC に伝えることは可能ですか?

ありがとう、ヨッヘン

4

1 に答える 1

0

コードで静的アナライザーの警告を抑制する方法については、https://stackoverflow.com/a/5833430/1313031を参照してください。

しかし、そうです、最善の方法は newInstance の名前を変更することです

于 2012-04-12T15:19:36.053 に答える