Сильный против слабого-как определить свойство, которое может быть или не быть связано с IBOutlet?


Я пишу многоразовый класс, который имеет свойство UITableView в виде IBOutlet. Тем не менее, я хочу, чтобы класс создал UITableView, если он не подключен к xib и, следовательно, nil. Если я установлю его в слабый, то выделение UITableView программно, кажется, не работает. Однако, если я сделаю его сильным, то если используется xib, он не обязательно будет правильно распределяться. Как лучше всего справиться с этим делом?

1   2   2016-01-08 03:10:35

1 ответ:

Свойства обычно объявляются слабыми, когда автор понимает, что кто-то другой сохраняет объект. Хорошим примером этого является контроллер вида, который хочет сохранить указатели на подвиды своего основного вида. Коллекция подвидов главного представления представляет собой массив, и массив сохраняет свои элементы (и так далее Для под-подвидов).

Поэтому правильно, чтобы ваше представление таблицы было объявлено слабым, независимо от того, настроено ли оно через IBOutlet. Но инициализация слабого указателя занимает немного времени. гимнастика такова, что вы можете сначала установить сохраненное отношение к объекту, прежде чем сделать назначение слабому свойству.

Чтобы продемонстрировать:

// assumes
@property(weak, nonatomic) IBOutlet UITableView *tableView;

- (void)viewDidLoad {
    [super viewDidLoad];

    if (!self.tableView) {  // if the outlet was not setup in IB
        // declare a stack variable that will be retained within the scope of this condition
        UITableView *tableView = [[UITableView alloc] init];
        // do whatever is needed to configure the tableView pointed to by this stack variable

        // this is key, make it a subview (establishing a retained relationship with subviews) first
        [self.view addSubview:tableView];
        // now we can assign it to our weak property
        self.tableView = tableView;
    }
}