2011-07-28 13 views
1

私はXCodeの計測器でリークツールを使用してメモリリークを検出しています(図参照)。私は、アプリケーションの異なるポイントで私のアプリを実行するたびに、いくつかのリークがあります。拡張された詳細を見ると、私が書いたコードは一切指されておらず、コードだけがxcodeの基礎に組み込まれています。この2つの例は以下のとおりです。計測器とメモリリーク

http://imageshack.us/photo/my-images/192/screenshot20110728at102.png/

http://imageshack.us/photo/my-images/853/screenshot20110728at102.png/

あなたが見ることができるように、問題のいくつかは、メッセージUIライブラリから来ます。私が使用している唯一の場所はここにあります:

-(void)displayComposerSheet 
{ 
    MFMailComposeViewController *mail = [[MFMailComposeViewController alloc] init]; 
mail.mailComposeDelegate = self; 

[mail setSubject:@"Suggestions"]; 

[mail setToRecipients:[NSArray arrayWithObjects:@"[email protected]", nil]]; 
[self presentModalViewController:mail animated:YES]; 
[mail release]; 
} 

-(void)launchMailAppOnDevice 
{ 
NSString *recepient = [NSString stringWithFormat:@"mailto:[email protected]"]; 
recepient = [recepient stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:recepient]]; 
} 

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error 
{ 
[self dismissModalViewControllerAnimated:YES]; 
} 

どうすればこの問題を解決できますか?ありがとう!

+0

は「私のコードでメモリリークがあるか、AppleのSDKであっリークしている?」 - 経験はどこ私のお金を入れて私に語った.... –

+0

感謝。だから多分あなたは私を助けることができます。 – Mason

+0

コードを投稿してください。 –

答えて

1

リークの原因を特定することは、必ずしも簡単な作業ではなく、リモートでの作業がさらに複雑になります。

あなたのケースでは、リークのメモリアドレスの隣に表示されている小さな矢印が役に立ちます。それをクリックすると、その時点で完全なスタックトレースを持つ情報ペインが表示されます。そこに提示されているメソッドのリストを調べて、あなたのメソッドを探し、それをクリックしてコードを調べます。

漏れたオブジェクトがのどこに作成されたのかを知るために、Instrumentsで行うことは他にありません。。あなたはそれをリリースすることができなかった可能性がある場所を見つけなければなりません。

Apple SDKに関しては、いくつかのメモリリークが報告されており、ウェブ上で見つけ出すことができますが、実際にはめったにありません。

Instrumentsがあなたを助けない場合、重要な考慮事項の1つは、Instrumentsがリークを報告したときのアプリは何でしたか? Webからデータを取得し、新しいビューを表示します。これは、今後の調​​査の分野を限定するのに役立ちます。リークが複数回現れた場合、これはプログラムのどの部分がそれを作り出す可能性があるかを特定するのにも非常に有用です。

これについて手掛かりがある場合は、そのコードを確認してください。 1つの手法(私はそれが奇妙に聞こえるかもしれませんが、それを試してみてください)は、コードの塊を取り除き、漏れがまだあるかどうかをチェックしています。

「コードチャンクを削除/コメントアウトする」とは、ウェブリクエストをしないことから、あるタイプのクラスを使用して別のクラスに置き換えないようにすることです。これは、アプリの機能性を損なうため、必ずしも単純なプロセスではないため、機能を削除してアプリを「テスト可能」にする方法についての知識を使用する必要があります。あなたが運が良ければ、リークの原因となっているコードをさらに区切るのに役立ちます。

も静的解析ツールが役立つかもしれないことに注意してください、それがリークし、時にはそれが間違っている、完璧ではありません。リークに基づいているのではなく、オブジェクトの割り当てに基づいてリークを検出する方法があります。これは私の経験では非常に強力です。私はこのケースでは助けにならないと考えていますが、これも試してみることを強くお勧めします。それはheapshot analysisと呼ばれます。

+0

ありがとうございます。私はすでに拡張された細部をチェックしました。そこにリストされた私の唯一の方法は、まったく変更していない "メイン"でした。何かご意見は? – Mason

関連する問題