1

以前にも同様の質問があったことは承知しています。しかし、私はしばらくの間 S​​O を検索してきましたが、まだ少し混乱しています。だからここに行きます...

私はARCを使用していません。以下のようなインスタンス変数とプロパティを持つビューコントローラーがあるとします。

ViewController.h:

@interface ViewController : UIViewController{
    NSDictionary *someDict;
}
@property(nonatomic, retain)UIView *someView;
@property(assign)UIView *someOtherView;

ViewController.m:

-(void)viewDidUnload{
    self.someView = nil;
    [someDict release];
    [someOtherView release];
    super viewDidUnload];
} 

これはviewDidUnloadを実装する正しい方法ですか? someDict = nil を設定するとリークするため間違っているように思われるため、私の推測ではリリースです。保持されていないため、同じことが someOtherView にも当てはまりますか?

私はここで間違っていますか?助けてくれてありがとう!

4

2 に答える 2

2

self.someView = nil[self setSomeView:nil]の property-synthesize ペアによって自動的に生成されると等しいため、リークしません@property(nonatomic, retain)UIView *someViewretain新しいオブジェクトが設定されると、保持されたオブジェクトが解放されるように属性を持っています。

にある[someDict release];べきだと思いますdealloc。また、所有権を持たないプロパティである[someOtherView release];ため、呼び出すべきではありません。assign

その他の参照:

于 2012-04-23T16:39:18.387 に答える
1

viewDidUnloadビュー コントローラのメイン ビューの保持されたサブビュー (つまり、辞書ではない!) であるすべてのビューを解放して nil する必要があります。それはとても簡単です。

だからあなたの

self.someView = nil;

正しいです。他のすべての保持されたサブビューもメソッドに追加するだけです。

someOtherViewこれは割り当てられたプロパティであるため、リリースしないでください。解放すると、アプリがクラッシュします。

もし私があなたなら、iVar 宣言 ( someDict) を取り除き、すべてのプロパティを使用します。

于 2012-04-23T16:43:24.667 に答える