我正在写使用ARC和定位iOS 5以上版本的iOS应用程序。
假设我写了一个代表属性自定义视图对象。 在宣布委托财产,我让一个弱引用,以避免保留周期,因此当实际委托对象(控制器)被破坏,我的自定义视图也将被销毁,具体如下:
@interface MyCustomView : UIView
@property (nonatomic, weak) id<MyCustomViewDelegate> delegate;
@end
一切都很好。
好了,现在我正在写控制器对象,它有两个视图对象的引用:我自定义的视图和苹果提供的UIKit的视图,两者都声明委托性质,而控制器是两种观点的代表。 也许它看起来是这样的:
@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中设置一个或两个代表到零?
我的意思是,我的理解是,在UIKit中视图的委托财产(在这种情况下, tableView
)实际上并没有被宣布为一个弱引用,而是一个__unsafe_unretained
引用,与iOS的非ARC版的向后兼容性。 所以,也许我需要写
- (void)dealloc
{
_tableView.dataSource = nil;
_tableView.delegate = nil;
}
现在,如果我要重写的dealloc,我还没有设置_customView.delegate = nil
,对吧? 因为这是宣布(由我)是一个弱引用,所以应该在销毁被自动设置为无MyViewController
。
但在另一方面,我不是针对iOS的非ARC的版本,我也不打算。 所以,也许我并不需要在所有覆盖的dealloc?