2009-07-03 12 views
1

Instrumentsはこのコードにmemリークがあると伝えますが、それを見つけることができません....申し訳ありませんまたは初心者の質問です。ここでメモリリークはどこですか?

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    int altoBufferCelda = 26; 
    Mensaje *msg = (Mensaje *)[model.mensajes objectAtIndex:indexPath.row]; 

    CGSize txtSize = [msg.texto sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:CGSizeMake(222, 222) lineBreakMode:UILineBreakModeTailTruncation]; 

    [alturasDinamicas setObject:[NSNumber numberWithFloat:(txtSize.height + altoBufferCelda)] forKey:[NSNumber numberWithInt:indexPath.row]]; 

    return txtSize.height + altoBufferCelda;  
} 
+0

これは何をすると思われますか?何が起こっていますか?どのような "楽器"ですか?あなたが情報をもっと与えるなら、人々があなたを助けるのを助けるでしょう – marcgg

+0

marcgg、情報が不足して申し訳ありません。これは、iphoneのために書かれたobjective-cコードです。このメソッドは、iphone開発者がよく知っているGUIコントロールを制御するために使用されるデリゲートの一部です。そしてInstrumentsは、mem leakや他の多くのものを検出するための開発ツールです。 – nico

+0

@marcgg私はCocoa開発者の間では、 "Instruments"が開発者ツールに含まれるプロファイリングアプリケーションだとよく知られていると言います。目的については、 "heightForRowAtIndexPath:"は十分に明確ではありませんか? –

答えて

0

私が言う: [のNSNumber numberWithFloat]

それはあなたのための自動解放オブジェクトを割り当てます。 iPhoneはガベージコレクションされておらず、参照のみが収集されています。また、メソッドを終了する前に割り当てているメモリを解放していないため、Instrumentsはそれをリークとして報告しています。

これは現在受け入れられているので、私は答えを変えます。

インストゥルメントは神聖な勅令ではありません。間違っている可能性があります。あなたが見ているべきものの強いガイドラインとしてそれを使用してください。正直なところ、コードで間違った、漏れがあるものを見つけることができない場合は、ただ進みましょう。

+0

私はこのリークを無視すべきですか?または何か違うことを試すありがとう! – nico

+3

これは間違っています。 [NSNumber numberWithFloat:]は、自動解放されたオブジェクトを返します。あなたはiPhoneにGCがないのは間違いありませんが、間違いなく自動解放プールがあります。実際のコードではリークは見られません。 * UIKitフレームワーク自体にリークがあります。 –

+0

自動解放プールはガベージコレクションと同じではありません。自動リリースされたオブジェクトが保持されていない場合は、現在のイベントの最後に解放されます。これはiPhoneおよびOS Xに当てはまります。オブジェクトがスコープ外にあり、それらにアクセスできます(到達できません)。 numberWithFloatはオートリリースされたNSNumberオブジェクトを返しますので、上記のメソッドで保持されていないので解放する必要はありません。 –

0

コードにメモリリークが見られません。トーストが指摘するとおり、インストゥルメンツは必ずしも正確ではありません。これは主に、Apple Frameworksのコードでもメモリリークが含まれているためです。これはInstrumentsでも報告されています。

XCode 3.2を使用している場合、ビルドメニューからビルドと分析を選択すると、通常はコンパイラが検出しなかったエラーをコードでスキャンできます。これは、オブジェクトを解放するのを忘れることから生じる可能性のある多くのメモリリークを表示します。

関連する問題