2010-12-08 6 views
0

インストゥルメントはこのコードにはリークがあることを伝えています。しかし、私は後でそれをリリースしたと確信しています。誰が私にここで起こっていることを教えてもらえますか?リークはどこですか?

- (void) addReminderEntry{ 
    DataEntryController* item = [[DataEntryController alloc] initWithEntryType:REMINDER]; // it says that the leak was instantiated here 
    item.delegate = self; 
    [[self navigationController] pushViewController:item animated:YES]; 
    [item setEditing:YES animated:YES]; 
    [item release];// this is the place I release it 
} 

おかげ

+1

あなたが十分な情報を提供していません。まず、「留意事項」とは何ですか?第2に、initWithEntryType:コードや、具体的に言ったインストゥルメントのタイプが漏えいした(これは間違いなくDataEntryControllerインスタンスですか?) –

+0

1. REMINDERは列挙型なので、リークする必要はありません。 2.はい、InstrumentsはDataEntryControllerインスタンスが間違いないと言います。返信いただきありがとうございます。 –

答えて

0

それは、これは、このコンストラクタによって引き起こされることが判明:

- (DataEntryController*) initWithEntryType:(DataType) eType{ 
    DataEntryController* item = [[DataEntryController alloc] init];//<- here 
    item.entryType = eType; 
    item.allowEdit = YES; 
    return item; 
} 

どうやらiOSのは、最初の「初期化」で、各コンストラクタに1を保持して追加します。

それはに切り替えた後正常に動作します:

DataEntryController* item = [super init]; 
1

それはDataEntryControllerクラス内に放出されていない何かに関係している可能性よりも、もっと。そのクラス内のすべてのプロパティ/ etcを解放していることを確認してください。

1

リークは、どこにメモリが割り当てられたかだけを示します。リークは、それをリリースしたはずのコードをどこに置くべきかを教えてくれません。

これは、ビューコントローラを作成したことを示しています。終了した後もメモリ内に残っています。はい、あなたはそのコードでVCをリリースしますが、提示した後でなければなりません。つまり、ナビゲーションコントローラはそれを保持しています。最終リリースが呼び出されたときにのみ割り当てが解除されます。

リリースされていないビューコントローラの主な原因は、通常、ビューコントローラが保持しているもののデリゲートとして自身を設定し、ビューコントローラがオフスクリーンになったときにそのビューコントローラを元に戻さないことです。あなたのView Controllerがそれを保持する何かのデリゲートであるなら、それは決して割り当て解除されません。

+1

など。 'DataEntryController'の代理人が' assign'ではなく 'retain'プロパティープロパティーとして定義されている場合、それは漏れるでしょう。 –

+0

ありがとうございます。これは情報があれば素晴らしい作品です。私はこれを知らなかった! –

関連する問題