3

このアプリをテストしているうちに、私はこの問題にぶつかりました。 私は、サーバーからメッセージを受け取る必要があり、そのメッセージをビューにリレーする必要があるクラスを持っています。これは私のやり方です:ARC使用時にオブジェクトを解放する

- (void) onMessage:(DFTopicMessage *) message {  
    [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"serverMessage" 
    object:message]; 
} 

クラスはメッセージで何もしません。 Instruments-> Leaksでプロファイリングすると、このコード行は潜在的なリークとして警告されます。私が問題を理解しているのは、メッセージが割り当てられ、使用され、決して解放されないということです。最初の奇妙なことは、自分のプロジェクトでARCを使用しているため、OSが自動的にvarを解放することを期待していますが、明らかにそうではありません(なぜ、varを解放しないのですか)。いずれにせよ、私はこの漏れを避ける方法を考え始めました。単にそのようなのように、ゼロに設定メッセージ:

- (void) onMessage:(DFTopicMessage *) message {  
    [[NSNotificationCenter defaultCenter] 
    postNotificationName:@"serverMessage" 
    object:message]; 
     message = nil; 
} 

がリークを防ぐことはできません。これは、潜在的な漏れのようにリークしなくなり、フラグ> - Iは、以下の方法、計測器とプロファイル場合

@interface myClass() 
@property(nonatomic) DFTopicMessage *message; 
@end 

@implementation myClass { 
@synthetize message; 
    .... 
    - (void) onMessage:(DFTopicMessage *) msg { 
     [self setMessage:msg]; 

     [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"serverMessage" 
     object:[self message]]; 

    } 
} 

:私はメッセージIVARを製造し、このようなアクセッサを使用して解決策を見つけました。私の質問です:これは、ARCを使用するときにvarを解放する強制の種類の唯一のソリューションですか?

ありがとうございます!

+0

ARCが有効になっていることは間違いありませんか?そのファイルに '[msg retain]'というコンパイラエラーがありますか? –

+0

私はインストゥルメントがここでは偽陽性を示していると思われます...しかし、あなたの "解決策"は一つではありません:あなたは単に 'message'への追加参照を保存するだけで、オブジェクトが依然として必要であると考えるようにインストゥルメントを騙します。実際には 'message'をこのようにリリースしません(しかし、とにかくそれは必要ではありません)。 – MrMage

+0

あなたのコメントをお寄せいただきありがとうございます。 @BJホーマー:私はARCを使用していると確信しています。[msg release] ARCを使用しているときに明示的にvarsを解放することについてのエラーを示します。 – Diferdin

答えて

0

プロジェクトを分析すると、このメソッドにも可能性のあるリークとしてフラグが立てられますか(そうは思わない)。

インストゥルメントが検出しているリークがこのメッセージオブジェクトですか。そうであれば、ARCを有効にしているので漏れてはいけないので、偽陽性でなければならないように見えます。

関連する問題