2012-04-12 7 views
0

私は、一般的なファクトリクラスから次の(簡体字)のコードがあります。アナライザは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であることを何らかの形でアナライザーに伝える必要があります。上記の例は単純化され、実際のプログラムでは、いくつかの制約がありますされています

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

  2. 私はどのメソッドの名前も変更できません。

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

それは、参照は間違いなく1であることを何らかの形で譲渡(id replacement = ...)の時点で、ARCを伝えることは可能ですか?

おかげで、 ヨッヘン

+0

の名前を変更することです私はあなたが、これがあると知っています一例ですが、なぜ 'alloc&init'を再開発/置き換えようとしている工場パターンですか?なぜ、 'init'が時々保持されるのでしょうか? 'ARCではない場合は' NSString * s = [@ "test" newInstance]のように見えるコードにつながります。 ; [リリース]; [sリリース]; 'あなたはそれを変更することはできませんが、とにかくそれを避けることができますか? – Joe

+2

基本的に、配置している制約によって、可能なすべての解決策が除外されます。まあ、私は実際にはごめんなさい、これは本当に悪いコードのように見えます。 – JeremyP

答えて

0

はコード

に静的アナライザの警告を抑制するための方法をhttps://stackoverflow.com/a/5833430/1313031を参照してくださいしかし、ええ、行うための最善のことはのnewInstance

+2

実際に行うべき最良のことは、悪くないようにコードを書き直すことです。彼は、どのクラスまたはサブクラスが使用されているかに応じて、異なる所有権セマンティクスを持つメソッドを持っています。これで安定したシステムを書くことはできません。 – JeremyP

+0

すみません。名前を変更することは人生を悪化させるだけです。これは、アークが防止することを意図した設計の種類です。あなたがこのコードに悩まされているなら、上記のリンクか-fno-objc-arcのいずれかが警告を隠すでしょうが、あなたはまだこのデザインに固執しています。 –

関連する問題