2011-02-22 17 views
1

私はそれらを保持するインスタンス変数として参照を持っているときに、私はviewDidUnloadのUIViewの私のサブビューをリリースする必要がありますか?私はプログラムでGUIを構築しました。私はそうするべきですか? uiviewとivarsの両方が保持されているので、オブジェクトが保持カウントに2を持つことになります。私はsetself.myIvar = nilにする必要があるので、UIViewはサブビューを解放しますが、それらはまだ保持カウントで+1を持っています。 viewDidUnloadでは?viewDidUnloadのUIViewのサブビューをリリースする必要がありますか?

お時間をいただきありがとうございます。

+2

私はappleがこのコメントをテンプレートのviewDidUnloadメソッドに入れていると思います。//メインビューの保持されたサブビューを解放します。 // self.myOutlet = nil; ' –

+0

@fluchtpunktあなたのコメントを精緻化し、回答として投稿できますか?彼らはいつ再初期化されるはずですか? – JoePasq

+0

重複していますか? http://stackoverflow.com/questions/1158788/when-should-i-release-objects-in-voidviewdidunload-rather-than-in-dealloc そして、ちょうど重複して叫んでいる馬鹿ではない!ほとんどの場合、viewDidLoad、loadView、またはインタフェースビルダーアウトレットを使用して設定されたすべてのビュー(おそらくはプロパティとして)を解放(nilに設定)する必要があります。重要なデータを消去しないでください。 – Mayjak

答えて

1

実際には、保持されているすべてのサブビューをviewDidUnloadで解放することができます。しかし、私は別の方法でそれを行うために使用:

-(void) viewDidLoad { 
    someInstanceView1 = [[UIView alloc] init]; 
    [self.view addSubview: someInstanceView1]; 
    [someInstanceView1 release]; 

    someInstanceView2 = [[UIView alloc] init]; 
    [self.view addSubview: someInstanceView2]; 
    [someInstanceView2 release]; 

    //etc... 
    //you have a references to someInstanceView1 and someInstanceView2 with retained counts 1 
} 

をメモリ警告が生じてしまう場合でも、この場合、ビューコントローラは、すべてのそれのビューサブビューを削除します。そしてviewDidLoadを再度呼び出します。したがって、漏れはなく、アイバールのリリースを心配する必要はありません。ビューアーのビューは、ビューアーへの強い参照を持つ唯一の所有者(それが自動的に解放される)になります。

+1

しかし、いくつかのサブビューを参照する必要があります。その後、これは動作しません。 – user626912

+0

参照が必要な場合はどういう意味ですか? v1 = [[UIView alloc] init]; - あなたはそれを持っています。そして、それがうまくいかないと教えてください。約10のプロジェクトで動作します;) – Max

+0

そのオブジェクトのインスタンス変数のような参照。そうすれば、後からアクセスして変更するのが非常に簡単になります。あなたはどのようにこれらのサブビューを取り除きますか?サブビューのリストを繰り返してリリースしますか?インスタンス変数を使用すると、それらを直接解放するだけで済みます。これは標準的な習慣であり、Appleがそれを行う方法です(ヒントヒント)。 – JoePasq

関連する問題