私は、一般的なファクトリクラスから次の(簡体字)のコードがあります。アナライザはreturn replacement:
に警告を生成objc_msgSendの使用時にスタティックアナライザのリーク警告を回避するには?
- (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_retainedで
invokeSetup
に注釈を付けることができない、とinvokeSetupが0の参照を返し、他のサブクラスがあります。 +1または+0の場合は、実行時にしか検出できません。私はどのメソッドの名前も変更できません。
デザインはそのままです。より良いデザインがあるかもしれませんが、ここで変更することはできません。
それは、参照は間違いなく1であることを何らかの形で譲渡(id replacement = ...
)の時点で、ARCを伝えることは可能ですか?
おかげで、 ヨッヘン
の名前を変更することです私はあなたが、これがあると知っています一例ですが、なぜ 'alloc&init'を再開発/置き換えようとしている工場パターンですか?なぜ、 'init'が時々保持されるのでしょうか? 'ARCではない場合は' NSString * s = [@ "test" newInstance]のように見えるコードにつながります。 ; [リリース]; [sリリース]; 'あなたはそれを変更することはできませんが、とにかくそれを避けることができますか? – Joe
基本的に、配置している制約によって、可能なすべての解決策が除外されます。まあ、私は実際にはごめんなさい、これは本当に悪いコードのように見えます。 – JeremyP