Я пишу приложения iOS с помощью ARC и настраиваю iOS 5 +.
Предположим, что я пишу пользовательский объект вида, обладающий свойством delegate. При объявлении свойства делегирования я делаю его слабым, чтобы избежать цикла сохранения, так что, когда уничтожается фактический объект-делегат (контроллер), мое пользовательское представление также будет уничтожено следующим образом:
@interface MyCustomView : UIView
@property (nonatomic, weak) id<MyCustomViewDelegate> delegate;
@end
Все хорошо.
Итак, теперь я пишу объект контроллера и ссылается на два объекта представления: мое пользовательское представление и представление UIKit, поставляемое Apple, оба из которых объявляют свойства делегата, а контроллер - делегат для обоих Просмотры. Может быть, это выглядит примерно так:
@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?