2009-03-23 11 views
6

私はメモリ警告を受け取っているiPhoneアプリを持っているので、私は、Instrumentsの助けを借りて、リークを見つけようとしているか、メモリのより効率的な使用などを試みています。とりわけ、私は自動解放されたオブジェクトを取り出し、手動のalloc/init/releaseオブジェクトに置き換えようとしています。ただし、一部のAPI呼び出しでは、 'init'バージョンはありません(下記のコードを参照)。Instruments Using Leaks&Object Alloc:自動リリ​​ースされたオブジェクトはリークとしてカウントされますか?

  1. 私はAPIの「を呼び出す」と背面基本的に自動解放オブジェクトを取得する場合には、これらのオブジェクトは、楽器の漏れとして表示することができます:私は確かにいくつかの基本的な誤解がありますか?インストゥルメントでこのような動作が見られるようです。

  2. 「はい」の場合は、「非自動解除」の代替方法がなく、必要なAPIを使用している場合は無視してください。また、このコードが多く呼び出された場合、私は完全にアルゴリズムを再考する必要がありますか?

私のアプリケーションでは、多くのものが呼び出されるユーティリティコードがあります。基本的に、2つの日付が意味的に「等しい」かどうかを判断します。コメント付きのコードに残しておいて、コードベースで改善するタイプを確認することができます。このDIDは、NSDateを手動で作成し始めてから、器具を実行したときにメモリリークを減らします)助けてくれた。しかし、私はまだ私がリークしていると信じ日付コンポーネントオブジェクトを持っている...しかし、それは、APIの呼び出しです(書式設定コードのため申し訳ありませんが、私はSOそれを改善するように見えることはできません):

+ (BOOL)isDayEqualToDay:(NSDate*)date anotherDate:(NSDate*)anotherDate 
{ 

    NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    //NSCalendar *cal; 
    NSDateComponents *componentsFromDate, *componentsFromAnotherDate; 
    NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;  
    //cal = [NSCalendar currentCalendar]; 
    componentsFromDate = [cal components:unitFlags fromDate:date]; 
    componentsFromAnotherDate = [cal components:unitFlags fromDate:anotherDate]; 

    BOOL bDatesEqual = ([componentsFromDate year] == [componentsFromAnotherDate year] && 
         [componentsFromDate month] == [componentsFromAnotherDate month] && 
         [componentsFromDate day] == [componentsFromAnotherDate day]); 

    [cal release]; 

    return bDatesEqual; 

    /* 
    return (
     [componentsFromDate year] == [componentsFromAnotherDate year] && 
     [componentsFromDate month] == [componentsFromAnotherDate month] && 
     [componentsFromDate day] == [componentsFromAnotherDate day] 
    );*/ 
} 

私は思いますcomponentsFromDateとcomponentsFromAnotherDateはリークとして表示されますが、本質的にはNSData API呼び出しから返されたオブジェクト(オートリリース済み)だけです。これをより効率的にするために他に何ができるのかよくわからないので、Instrumentsをどのように使いこなすかについて私は理解していますか?提案?

答えて

4

自動解放されたオブジェクトがメモリリークとして表示されることはありません。しかし、APIにはいつかメモリリークがあります。 appleでバグレポートを提出する必要があります。 NSCalendarやNSDateComponenetsのような新しいクラスは特に疑わしいです。

retainとautoreleaseについては、一般的なルールは、タイトなループでなければ問題ではないということです。その場合、タイトなループがイベントを残さずに何千回も繰り返されている場合、自動解放プールを決してクリーンアップしないということです。

3

GCDのようなものを使用しているときには自動解放プールがありますが、いつでも(もしこれがあったとしても)デフォルトの自動解放プールがなくなった場合、あなたは知る方法がありません。 atoreleasedオブジェクトがリリースされていないと確信している場合は、あなたが使用しているスレッドのAPIを理解していることを確認してください。もしメモリが私の右GCDコール(dispatch_async)であなたのために自動解放プールをソートしてくれますが、プールの実際の排水には長い時間がかかります。一方、NSOperationsは自動解放プーリングを所有します。

私は、10秒間隔に依存するインストゥルメントでのメモリリーク検出で、自動解放プールがなくなるまでに遅延が長引いたために誤ったmemリークの警告が発生することが判明しました。だから違反コードを次のように改めてみてください。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
... [your code] ... 
[pool drain]; 

すべてのオートレスアをマニュアルリリースに置き換えることをお勧めします。 autoreleaseを使用すると、保持された保持/解放呼び出しのカウントが1つの場所に表示されます。オブジェクトを作成してからすぐにオートリリースすると、私の意見ではたくさんのメモリ不具合を防ぎます。すばやく簡単。手動のリリースコールを使用するときは、物事をリリースすることを忘れてしまいます。特に手動でリリースするときは、エラー状態が厄介です。

プールを自分で行うと、より多くの制御ができます。また、割り当てが集中している作業では、プールを作成して排水することが効果的です。しかし、いつものように、試してみて、何らかの仮定をしないでください。

+0

GDCのデバッグにintstrumentsを使用する方法はないようです。多分別の方法がありますか? –

関連する問題