2012-04-20 8 views
1

私はオープンソースプロジェクトでこのメソッドを使用していますが、スタティックアナライザを実行しようとするとメモリがリークしないのはなぜかと思います。私はそれが漏れるはずだと思う理由は、それはメモリを割り当てているがそれをリリースしないためです。メソッドが呼び出されるたびに解放されます(= nilのため)。誰でも私のために光を当てることができますか?なぜこのNSMutableSetのメモリが漏れていないのですか?

- (BOOL)isValid(NSString *)name 
{ 
    // Using a set so access is faster 
    static NSMutableSet *exp = nil; 

    // Setup the set once with AB testing info 
    if (exp == nil) { 

      exp = [[NSMutableSet alloc] initWithCapacity:5]; 

    } 

    if (exp != nil) { 
     return YES; 
    } 

    return NO; 
} 
+0

弧を使用していますか –

+0

いいえ、私はまだこれをホストしていません.. – adit

+0

静的でない場合は文句を言いますか? expが静的であるとすれば、それは不平を言いたくはありません。静的なポイントが保持されているオブジェクトを保持するほどの漏れはありません。 – Obliquely

答えて

5

アナライザはstaticストレージ修飾子を認識し、それが(もちろん、終了まで)の範囲の外に出ていないことを理解しています。

メソッドが呼び出されるたびに(= nilのために)メソッドが呼び出されます。

そうではありません。これはメソッドが初めて呼び出されたときに発生します - それはstaticであるため1回だけです。

+0

に文句を言うことはありませんが、それは実際に漏れていますか?私は方法の最後にそれをリリースする必要があります – adit

+0

nope。私はまた、初期化について少し追加しました。ある方法では、終了するまで割り当て解除されません。それは1つのインスタンスだけです(もちろん、競合状態はないと仮定します)。これは実際にグローバルデータがどのように機能すると予想されているのか、アナライザはその型に基づいてオブジェクトを早期に割り振り解除できるという静的な情報を持っていません。しかし、これも戻り値を変更するので、適切に処理されます。 – justin

+0

うーん...それはどのように静的ですか?NSMutableSet * exp = nil;初回のみと呼ばれていますか?いつそれが解放されるのですか? – adit

2

expは静的なためアナライザは不平を言っていません。静的な状態で再度分析してみると、苦情があります。 (これをXcodeで確認したところ、ARCをオフにしています)

静的なものについて考えてみてください。この変数がオブジェクトを指していることをコンパイラに伝えています。もうオブジェクトを指し示すものが何もなく、メモリを解放する機会がない場合は、リークだけです。

+0

しかし、上記のコードを見ただけでは、関数が呼び出されていない場合、割り振り中であり、解放していないので、漏れているようです。 – adit

+1

expはまだオブジェクトを指しているので、漏れていません。オブジェクトはまだ周囲にあり、指しています。それはリークされたものではなく、保持されたオブジェクトです。漏洩したオブジェクトは、あなたがどこに住んでいるかを忘れてしまったので、決して解放することができないものです。割当およびリリースしないことは漏れと同じではありません。時にはこれを意図的にやりたい静的な、cf.シングルトンの実装方法 – Obliquely

+0

大丈夫ですが、割り振りしてリリースしないことは、漏れと同じではないことを私に教えてくれると思います。ありがとうございます – adit

関連する問題