Учитывая, что self небезопасен в Objective-C, мы можем сказать, что нет оснований когда-либо вызвать методы или получить доступ к свойствам слабых объектов? то есть. Никогда не делайте этого:Есть ли веская причина для вызова методов на слабых объектах?
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf doStuff];
});
Конечно, технически это может быть хорошо, если есть еще одна сильная ссылка на самоопределение, которое гарантировано не оставаться в рамках, пока называется DoStuff, но это очень плохая причина.
Если нет веских причин, то не было бы хорошей идеей для компилятора просто отказаться от таких вызовов, по крайней мере, за вариантом компилятора?
В ответ на ваш вопрос есть множество отличных причин использовать общий шаблон 'weakSelf', хотя по практическим соображениям мало смысла делать это точно так же, как в вашем примере. Это было сказано, мы, конечно, не хотели бы, чтобы компилятор отклонил этот шаблон. Мы можем легко построить сценарии, где мы хотим сделать именно это. Например, что, если это было в обработчике завершения запроса сети от контроллера представления, и завершило обновление объекта модели, а 'doStuff' затем обновлял пользовательский интерфейс? Вы можете сделать что-то очень похожее на то, что у вас здесь. – Rob
Это была опечатка, я имел в виду небезопасную неохваченность. Вам, конечно, не нужно называть [weakSelf doStuff] для сетевого запроса. Вы всегда можете делать typeof (self) strongSelf = weakSelf; [strongSelf doStuff]; По-видимому, для слабых объектов объект по существу становится сильным во время doStuff, поэтому добавление strongSelf будет избыточным в этом случае. –
Измененные прилагательные, описывающие причины от «сильных» и «слабых» до «хороших» и «бедных», чтобы не совпадало с терминологией управления памятью клана.Кроме того, считайте, что ссылка * действительно __weak * будет бессмысленной, потому что она будет выпущена сразу после назначения. – danh