2011-05-25 8 views
0

私はそれを得たと思ったが、私はメモリ管理の理解に問題がある。私はplistのからの私のデータをインポートした後、私は完全に参照カウントの私の理解でめちゃめちゃ(とそれを修正しようとして一日を過ごす)リリースする内容

私のplistの構造は、基本的にはちょうどである得た:

<dict> 
<key>Menue1</key> 
<array> 
    <dict> 
     <key>pic1</key> 
     <string>a</string> 
     ...and so on... 
    </dict> 
    <dict> 
     <key>pic1</key> 
     <string>a</string> 
     ...and so on... 
    </dict> 
    <dict> 
     <key>pic1</key> 
     <string>a</string> 
     ...and so on... 
    </dict> 
</array> 
<key>Menue2</key> 
<array> 
    <dict> 
     <key>pic1</key> 
     <string>a</string> 
     ...and so on... 
    </dict> 
    <dict> 
     <key>pic</key> 
     <string></string> 
     <key>text</key> 
     <string></string> 
    </dict> 
</array> 
</dict> 

とでコード

参照カウント(私はそうだと思いますが)の考えを理解していますが、基本的な数学は失敗するようです。 viewDidLoad

dict = 1 
exercises = 1 
exerciseViewContent = 1 

、私はそれがとてもFIRSTで

dict = 1 
exercises = 1 
exerciseViewContent = 2 
tempdict = 1 

ようになり仮定の上に、私はすべてこのようなものを行いますため、私は以下のようにして参照を想定@interface

viewDidLoadtempdictの中に一度公開し、の3つのすべて(dict, exercise, exerciseViewContent)を解放する必要があると思いました0を0にするには、0をすべて取得してください。私はかなりの時間を過ごした後にexerciseViewContentdeallocにリリースしなければならないことが分かりましたが、exerciseまたはdict(私はそのプロパティをインターフェイスに保持して設定しています。 tempdictをリリースする必要はありませんが、私はallocを使っているので、私が理解する以上に多くのことを理解しています。ちょっと手を動かすだけで今動作しています(今まで)。

だから私は知りたいのです:すべての

  • まず:私の記憶の管理は、このように正しいのですか?
  • dictがリリースされました。私はそれをリリースしません(または私のAppクラッシュ)?
  • これはplistからdictsと配列にアクセスする適切な方法ですか?
  • 私はinitWithContentsOfFileにはオートリリースが含まれていると仮定しますが、どうすればよいでしょうか? autoreleaseを含むメソッドのリストがありますか(またはリストがないのですが、これまでにないものはありますか)?
  • "すべてのallocまたはinitがリリースを必要とする"ため、実際にはうまくいっています。明らかにここには当てはまりません。

さらに、「パス」を解放する必要がありますか?

もは次のとおりです。

[timer invalidate]; 
timer = nil; 

リリースと同じ、私はそれを保持するプロパティですセットが、私は明らかにまた、タイマー(NSTimer)を解放する必要はありませんと?それとも、NSIntegerのように、公開する必要はありませんNSTimerですからクラスリファレンスでは、どのタイプをリリースしなければならないのか、デフォルトではないのか分かりますか?

そして:私はそれがインターフェイスに保持するプロパティです設定した場合はXcodeのテンプレートから

  • (:)

    (void)viewDidUnload { 
        [super viewDidUnload]; 
        // Release any retained subviews of the main view. 
        // e.g. self.myOutlet = nil; 
    } 
    

が、私はまだ "myOutlet" をリリースする必要がありますか?

+0

dict、excercises、およびexerciseViewContentのセッターをどのように実装/合成するのですか? – cem

+0

"...'my.dict = tempDict;'と 'dict = tempDict;'は**同じ**ではないことに注意してください(これはインターフェイスで保持されているプロパティを設定して合成します)。 – albertamg

答えて

4

変数dictとtempDictはオブジェクトへのポインタであり、オブジェクト自体ではありません。だから、あなたがこれを行うとき:

あなたが本当に唯一 同じオブジェクトへのエイリアスを設定している
dict = tempDict; 

。リリースをtempDictに送信することもdictに送信しています。これがクラッシュする理由です。割り当てたばかりのオブジェクトを解放したので、もはやそれを所有していません。オブジェクトは割り当てられていません。

このようなメモリ管理は正しいですか?

[tempDict release]がない場合は、yesになります。それらを使って作業を終えたら、dictとexerciseViewContentの両方をallocで取得したので、それらを解放する必要があります。

私はそれを(または私のアプリケーションのクラッシュ)をリリースすることはありませんので、辞表リリース?

上記のように、tempDictは同じオブジェクトを指しています。リリースtempDictとあなたはdictをリリースします。

これはplistからdictsおよび配列にアクセスする適切な方法ですか?

私はちょうどこのようexerciseViewContentを得るでしょう以外はOKです:

exerciseViewContent = [exercises objectAtIndex:0]; 

その後、あなたはそれを解放する必要はありません。

initWithContentsOfFileには自動解放が含まれていると仮定しますが、どのように知っていますか?

いいえ、そうではありません。重要な点は、あなたがオブジェクトを所有していることを意味するallocを使ってオブジェクトを取得したことです。それを知る方法はC ocoa Memory Management Rulesを理解することです。

私は実際には明らかにここに収まらない「のリリースを必要とするすべてののalloc またはinit」ので、うまくいく親指のルールを持っているしたいと思います。

はい、適合します。

dict = tempDict; 
+0

非常にいい回答 –

+0

@Praveen:私は多くの練習を持っていました:) – JeremyP

+0

LOL、経験が助けます –