2011-01-14 2 views
2

3時間ほど後、私は最終的にView Controllerでメモリリークを修正することができました。リークは、そのプロパティがヘッダーファイルで '保持'に設定されているUIPickerViewによって引き起こされました。Objective-Cのメモリ管理 - これはすべて間違っていると確信しています

次のコードは、それを修正するために管理:

- (void)viewDidLoad { 
    [super viewDidLoad];  
    myPicker = [[[UIPickerView alloc] initWithFrame:CGRectZero]autorelease]; 
} 

- (void)dealloc { 
    [super dealloc]; 
    [myPicker release]; 
    myPicker = nil; 
} 

私はそれが悪いことを知っている...このコードがどのように衝撃的な私に教えないでください。私は、リリース、 autoreleaseを持っています。問題は、上記のいずれかの部分を変更または削除すると、メモリリークが返されることです。

私はない、明らかに、どのように客観的Cのメモリ管理の仕組みを知っていたのに、私は...

はなぜ上記のコードは、メモリリークを修正し、どのようなコードを見て、正しいバージョンのかもしれませんか?

-

EDIT:誰もが同じ問題を抱えている、または関心がある場合

- 問題は、私のクラス内の他のオブジェクトの一つが「維持」ではなくに設定したことを「割り当てます' (オブジェクトを所有していない場合は、保持ではなくプロパティの割り当てが必要です。

Cannondaleのように、余分な保持を削除するとすべてが修正され、リリースは1つだけ必要です。

+0

あなたの声を聞いてうれしいです。ニース1 :) – RedBlueThing

+0

これは助けるかもしれません:http://interfacelab.com/objective-c-memory-management-for-lazy-people/ – hlfcoding

答えて

4

あなたのコードのどこか他の場所にmyPickerを保持する必要があります。 myPickerの割り当て行は、スタックがviewDidLoad呼び出しのためにアンロールするとすぐにそのメモリを解放します(つまり、自動解放によって実行されていることです)。

あなたは[myPicker release]が予期しない結果を伴う未割り当てメモリを解放しようとしていない場合は、その時点の後のどこかでretainを実行する必要があります。

あなたがしなければならないことは、viewDidLoadでメモリを割り当てることです(したがって、自動解放を削除してください)。他の場所にオブジェクトを保持せず、myPickerをdeallocから解放するようにしてください。 bbumはdeallocを再言ったことも

...;)

+0

ありがとう - たくさんの意味があります!大変感謝しています:)今、余分なものを見つけようとしています。 –

+0

'myPicker'はあなたのインターフェースファイルで作成したプロパティです。それは私の推測です。 –

4

何Cannonadeは語りました。これはうまくいくはずです:

myPicker = [[UIPickerView alloc] initWithFrame:CGRectZero]; 

あなたのdeallocも破棄されます。 superへの電話は常に最後にする必要があり(考えてください)、それは未定義の動作につながる可能性があります。

- (void)dealloc { 
    [myPicker release]; 
    myPicker = nil; 
    [super dealloc]; 
} 
+0

それはまだとてもエレガントです。私はObjCを私のために学ぶべきだと思う。 –

+0

ここではmyPickerをnilに設定することはできません。誤って参照解除する危険性がないように、これを参照できるのは最後です。 – JeremyP

+0

十分です。私は '[foo release]、foo = nil;'と習慣化してしまいます。今すぐデバッグを簡単にします(deallocの外にリリースする必要がある場合は、私は3回クリックコピー/ペーストできます)。 – bbum

関連する問題