ジェネリック ファクトリ クラスからの次の (簡略化された) コードがあります。
- (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であることをアナライザーに伝える必要があります。上記の例は簡略化されており、実際のプログラムにはいくつかの制約があります。
invokeSetup
継承されているため、ns_returns_retained で注釈を付けることはできません。また、invokeSetup が +0 参照を返す他のサブクラスがあるためです。+1 または +0 の場合、実行時にのみ検出できます。メソッドの名前を変更することはできません。
デザインはそのままです。より良いデザインがあるかもしれませんが、ここでは変更できません。
id replacement = ...
参照が確実に +1 であることを割り当て ( ) の時点で何らかの方法で ARC に伝えることは可能ですか?
ありがとう、ヨッヘン