ARC を使用し、iOS 5 以降を対象とする iOS アプリを作成しています。
デリゲート プロパティを持つカスタム ビュー オブジェクトを作成するとします。デリゲート プロパティを宣言する際に、保持サイクルを回避するために弱参照にします。これにより、実際のデリゲート オブジェクト (コントローラー) が破棄されると、次のようにカスタム ビューも破棄されます。
@interface MyCustomView : UIView
@property (nonatomic, weak) id<MyCustomViewDelegate> delegate;
@end
すべてが良いです。
コントローラー オブジェクトを作成しています。このオブジェクトには、カスタム ビューと Apple 提供の UIKit ビューの 2 つのビュー オブジェクトへの参照が含まれています。どちらもデリゲート プロパティを宣言しており、コントローラーは両方のビューのデリゲートです。たぶん、次のようになります。
@interface MyViewController : UIViewController <MyCustomViewDelegate, UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) MyCustomView *customView;
@property (nonatomic, strong) UITableView *tableView;
@end
@implementation MyViewController
- (void)viewDidLoad
{
self.customView.delegate = self;
self.tableView.dataSource = self;
self.tableView.delegate = self;
}
@end
私の質問は次のとおりです。dealloc をオーバーライドして、いずれかまたは両方のデリゲートを nil に設定する必要がありますか?
私が理解しているように、UIKit ビュー (この場合はtableView
) のデリゲート プロパティは、実際には弱い参照として宣言されているのではなく、__unsafe_unretained
非 ARC バージョンの iOS との下位互換性のために参照として宣言されています。だから多分私は書く必要があります
- (void)dealloc
{
_tableView.dataSource = nil;
_tableView.delegate = nil;
}
今、dealloc をオーバーライドする必要がある場合でも、設定する必要はありません_customView.delegate = nil
よね? それは(私によって)弱い参照であると宣言されたため、 の破棄時に自動的に nil に設定する必要がありMyViewController
ます。
しかし一方で、私は非 ARC バージョンの iOS を対象としているわけではなく、そうするつもりもありません。たぶん、dealloc をオーバーライドする必要はまったくないのでしょうか?