2011-08-10 15 views
0

私の問題は、NSSortDescriptorで配列をソートすることですが、いくつかのリークがあります。 私はObjective Cの新機能ですが、C++での背景については知っていますが、保持、解放、自動解放については分かりません。私、減少し、コードは次のとおりです。私はいくつかの漏れがある場合はiPhoneでautoreleaseを使用しているときの問題を解決するには?

  1. :ここ
    NSSortDescriptor  0x80148a0 32 myProject -[myClass sortByDate] 
    __NSArrayI   0x80148c0 16 myProject -[myClass sortByDate] 
    __NSArrayReverseEnumerator 0x84079c0 16 UIKit -[UITableView reloadData] 
    __NSCFArray   0x8015f10 32 Foundation +[NSArray(NSArray) newWithContentsOf:immutable:] 
    Malloc 32 Bytes  0x800f330 32 Foundation +[NSArray(NSArray) newWithContentsOf:immutable:] 
    __NSArrayI   0xc914e90 352 Foundation -[NSArray(NSKeyValueSorting) sortedArrayUsingDescriptors:] 
    

    が私の質問です:

    -(IBAction)sortByDate 
    { 
        NSSortDescriptor *Descriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES]; 
        NSArray *sortDescriptors = [NSArray arrayWithObject:Descriptor]; 
    
        NSArray *sortedArray =[productListe sortedArrayUsingDescriptors:sortDescriptors]; 
    
        [productListe release]; 
        productListe=nil; 
        productListe=[[NSMutableArray alloc]initWithArray:sortedArray]; 
        [tableViewProduct reloadData]; 
    
        NSLog(@"[Descriptor retainCount] =%i",[Descriptor retainCount]); //(return 2) 
    
        NSLog(@"[sortDescriptors retainCount] =%i",[sortDescriptors retainCount]); //(return 1) 
    
        NSLog(@"[sortedArray retainCount] =%i",[sortedArray retainCount]);//(return 1) 
    } 
    

    インスツルメンツでは、私はリークのリストを取得します私のアプリケーションでは、Appleはappstoreからそれを拒否しますか?

  2. クラッシュなしですべてのオブジェクトを解放するにはどうすればよいですか。
  3. なぜreloadDataがリークしますか?
  4. アプリケーションでFoundationリークのようなリークを追跡するにはどうすればよいですか。

これは私の最初のアプリケーションであり、フォーラムでの最初の質問です。すべての回答に感謝します。


お返事ありがとうございます。 私は楽器を使用し、適切な場所(私は思う;))のすべてを解放するが、私は私のテーブルビューをソートしようとすると、アプリケーションのクラッシュ(reloadDataとそれなし)。 と、もしあなたが楽器の中のパーセンテージ(%)を知ることができたら?

私は機器のリークがありません(リロードデータリークを除いて、私はあなたがこれで私を助けないと思います) hersは私がcmd + shift + Aを使っているかを見ることができる画像です申し訳ありません、それの彼女の名前):

https://lh6.googleusercontent.com/-cjs_IGsE1Vw/TkccLmyAsGI/AAAAAAAAAEA/YrkE9fUS9XA/Capture%252520d%2525E2%252580%252599e%2525CC%252581cran%2525202011-08-14%252520a%2525CC%252580%25252001.48.43.png

i「がsortDescriptorsが」自動解放されると思いますが、私は楽器にそれを解放いけない場合、私は50%のリークを持っている????

だと思います。

+0

retainCounrは役に立たないです。それを呼び出さないでください。 – bbum

答えて

0

私はあなたのアプリストアの質問に対処できませんが、漏れを見つける方法を教えていただけます:静的解析を実行してください。 LLVMはあなたのコードを分析して、それぞれのリークがなぜ発生しているのかを詳細に説明します。

1
  1. おそらく、承認されただけであっても、リークを防ぐ必要はありません。

  2. Objective-Cのメモリ管理(例:Memory Management Programming Guide)を読んでください。

  3. これが呼び出されたときに作成されるオブジェクトは解放していません。

  4. 実行ビルド/その他のデバッグツールを構築し、分析または使用は、Xcodeのに含まれているか、確かに外部アプリを

4
  1. を使用していません。しかし、漏れが問題を引き起こす可能性があります。特に、ユーザーが長い時間それを使用する場合。メモリがリークするとクラッシュするので、Appleはあなたのアプリケーションを拒否するかもしれません。

  2. 完了後、メモリを割り当て、NSSortDescriptorを適切に解放せずに初期化します。あなたがもうそれを必要としないならば、できるだけ早く解放するのが大雑把なルールです。 retainCountを2にします。なぜなら、それを追加するときにDescriptorに保持メッセージを発行するNSArrayオブジェクトに追加したからです。

  3. 運が悪い場所にスポットを当てる能力には、 深刻なことに、Instruments.appをリーク検出モニターで使用し、アプリで再生します。割り当てられたオブジェクトのretainCountを含むメモリ割り当てと保持/解放を調べることができます。これは大きな助けになります。

リークにつながるスタックトレースを見て、部品を特定し、適切な保持/解放を確認してください。

autoreleaseオブジェクトに対するコメント。 autoreleaseは現在のNSAutoreleasePoolオブジェクトに適切なエントリを追加します。あなたがそう言ったら、このプールは消耗し、すべてのイベントループの始めに消えます。詳細については、NSAutoreleasePoolクラスリファレンスを参照してください。

メインスレッドのメソッドを処理している間は、メインイベントループをしばらくブロックするので、通常は貴重なオブジェクトをクリーンアップしません。

ほんの少し役に立ちます。

関連する問題