Вызывается метод супер, поддерживаемый в реализации блока Objective-C?
Когда я вызывал метод на супер, была бы выбрана ошибка EXC_BAD_ACCESS, но как только я изменил эти вызовы с [super methodToCall]
на [self methodToCall]
, и пусть сообщение движется вверх по цепочке ответчиков, в которой он работал нормально.
В экземпляре класса, в котором существует блок, нет реализации -methodToCall
, но в суперклассе (то есть классе, на который он наследуется) есть один.
Мне просто интересно узнать подробности о том, почему вызов метода супер в реализации блока был проблемой в первую очередь (технически), поэтому я могу избежать этого в будущем. У меня есть подозрение, что это связано с тем, как переменные захватываются в блоке и что-то о стеке и куче, но у меня нет конкретной идеи.
Примечание: код реализации блока вызывается до нескольких секунд после того, как блок хранится в свойстве, свойство использует copy, поэтому я не думаю, что это проблема с жизненным циклом блока, что все выглядит хорошо. Кроме того, это было только сбой на устройстве iPhone (3G), но он работал без сбоев в iPhone Simulator.
Результаты в EXC_BAD_ACCESS
:
[self retrieveItemsForId:idString completionHandler:^(NSError *error) {
if (!error) {
[super didRetrieveItems];
} else {
[super errorRetrievingItems];
}
}];
Работает отлично, реализации -didRetrieveItems
и -errorRetrievingItems
находятся в суперклассе.
[self retrieveItemsForId:idString completionHandler:^(NSError *error) {
if (!error) {
[self didRetrieveItems];
} else {
[self errorRetrievingItems];
}
}];