2010-12-27 8 views
1

私はplistを持っており、その情報をnsmutabledictionaryで取得します。 初めてこのメソッドを呼び出すと大丈夫です。しかし、2回目、3回目などで同じことをすると、リークが発生します。コードは次のとおり同じ操作を2回行った後にリークを取得する

+(NSMutableDictionary *)obtainPlist{  
    if ([[NSFileManager defaultManager] fileExistsAtPath:[self dataFilePath]]) { 
     return [NSMutableDictionary dictionaryWithContentsOfFile:[self dataFilePath]]; 
    } 
    else { 
     return nil; 
    } 
} 

及びIは、別のクラスからこのメソッドを呼び出す:

NSMutableDictionary *credenciales=[[NSMutableDictionary alloc ] initWithDictionary:[CredencialesFTP obtainPlist] ]; 
ajustesCredencialesTableViewController.nombre = [credenciales objectForKey:@"nombre"]; 
ajustesCredencialesTableViewController.password = [credenciales objectForKey:@"password"]; 
[credenciales release]; 

これはdataFilePathコードがある:

+(NSString *)dataFilePath{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return [documentsDirectory stringByAppendingPathComponent:kCredenciales]; 
} 

リーク方法obtainPlistの呼び出しであります。私はautorelease nsmutabledictionaryを試みたが、それは動作しません、任意のアイデア??ありがとう。

+0

あなたはあなたが漏れていると思いますが、何ですか? dataFilePathのコードを記述してください。 – Eiko

+0

インストゥルメントは私にリークを与えています。私はdataFilePathコードを追加します –

答えて

0

まず、漏れているものオブジェクト?

インストゥルメントでは、正確にどのオブジェクトが漏れているのか、それが割り当てられたコード行は何か。

これを取得したら、Allocations計測器で「トラック参照カウント」をオンにして、保持/リリースのシーケンスを確認する必要があります。

これまでに投稿したコードにはリークはありません。可能性としては、release dでないdeallocまたはのインスタンス変数があり、最初に値が0以外の変数を割り当て直している可能性があります。

すなわち:

id foo = [Foo new]; 
foo = [Bar new]; // this leaks the Foo instance 
foo = [Baz new]; // this leaks the Bar instance 

あなたは、何を保持され、漏洩している辞書を解放し、参照カウントの記録をオンにしますか?

alt text

(あなたはまた、リークを追跡するとき、 "唯一のアクティブな割り当てを追跡する" をオンにすることができます。)


なるほど!今我々はどこかに行っている!

したがって、漏れたオブジェクトはNSCFStringです。 NSStringをすべての目的と目的のために使用します。

ajustesCredencialesTableViewController.password = [credenciales objectForKey:@"password"]; 

だから、あるあなたreleaseあなたがpasswordプロパティに割り当てる文字列をINGの:

あなたはこのコード行がありますか?パスワードプロパティが retainまたは copy(それは copyであるはずです)と定義されていると仮定すると、どこかに解放する必要があります。

パスワードは絶対に保存しないでください。今までにない。パスワードを塩でハッシュし、その代わりに保存します。

+0

と一緒に使用する必要があります。インストゥルメントはそれが漏れていると言います。しかし、それは他の時間に発生します。私はこのメソッドを呼び出すことはありません –

+0

私は割り当てを試しましたが、どこにリークを引き起こす割り当てがあるのか​​わかりません。 resposibleフレームはnsdictionaryですが、リークされたオブジェクトはnscfstringです。スタックトレースにIclickを置くと、私が投稿したコードが表示されます。 –

+0

あなたは正しいです!そのnsstringにあった。私は別の辞書から呼び出されたので、私はそれを解放しなかったと私はアプリのクラッシュnsstringをリリースする場合。最後に、nsstringを削除して別の方法で情報を渡して解決しました。今私はそのリークを取得していない...しかし、私は(シミュレータでは発生しません)デバイスを起動するとリークを取得していますが、それは異なっています。 generalBlock-16とトラックからのこの新しいリークには、私のアプリケーションのコードは含まれていません。一度しか現れません、何が起こっているのか分かりますか? –

0

多分漏れが[self dataFilePath]で発生したか、あなたの辞書をalloc-initしないようにしてくださいすることができます

NSMutableDictionary *credenciales = [CredencialesFTP obtainPlist]; 
ajustesCredencialesTableViewController.nombre = [credenciales objectForKey:@"nombre"]; 
ajustesCredencialesTableViewController.password = [credenciales objectForKey:@"password"]; 

// EDIT:そう漏れがobtainPlistで発生した場合は、両方の方法を分離しようとすると、正確に作成する見ることができますリーク。

最初だけの問題をデバッグし、単離するための

+(NSMutableDictionary *)obtainPlist{ 
    [[NSFileManager defaultManager] fileExistsAtPath:[self dataFilePath]]; 
    return nil; 
} 

、その後

+(NSMutableDictionary *)obtainPlist{ 
    return [NSMutableDictionary dictionaryWithContentsOfFile:[self dataFilePath]]; 
} 

を試してみてください。

+0

彼は保持されたインスタンス(initWIthDictionaryから)を望んでいるようです。 [[CredencialesFTP obtainPlist] retain]を試してください。 – thelaws

+0

私はそれを保持しようとしましたが、それは別のリークをもたらし、私は辞書をalloc-initしなかったが、問題は解決しない。 –

+0

彼は3列下の彼が再びそれをリリースするので、特に望んでいないと思う;) –

-2

あなたは、このケースでは、関数宣言のこのタイプを使用する必要があります。

-(NSMutableDictionary *)obtainPlist 

の代わり:

+(NSMutableDictionary *)obtainPlist 
+0

-1。申し訳ありませんが、全然ナンセンスです。 – Eiko

+0

そしてそれは完全に間違っています+あなたがそれを呼び出すことができるようにクラスメソッドをマークします。クラス –

+0

を+私はその方法でやっているので、alloc-initを必要としません。クラスだけを使用してください –

0

このリークはシミュレータまたは実際のiOSデバイスで確認できますか?この2つの間の既知の不一致の1つは、Instrumentsがデバイス上で正常なシミュレータのリークを報告することです。

コードはわかりやすく表示されます。

+0

はい、私はそれをシミュレータとデバイスで証明し、そのリークは両方に現れます –

関連する問題