Поддерживается ли вызов метода на super в реализации блока Objective-C?
Когда я вызывал метод на super и EXC_BAD_ACCESS ] будет выдано сообщение об ошибке, но как только я изменил эти вызовы с [super methodToCall]
на [self methodToCall]
и позволил сообщению перемещаться вверх по цепочке респондентов, все заработало нормально.
Нет реализации -methodToCall
в экземпляре класса, в котором существует блок, но он есть в суперклассе (то есть в классе, от которого наследуется сам).
Мне просто любопытно узнать подробности того, почему вызов метода на super внутри реализации блока был проблемой в первую очередь (технически), чтобы я мог избежать этого в будущем. У меня есть подозрение, что это связано с тем, как переменные фиксируются в блоке, и что-то о стеке и куче, но у меня нет конкретного представления.
Примечание: код реализации блока вызывается через несколько секунд после блок хранится в свойстве, свойство использует копию , поэтому я не думаю, что это проблема с жизненным циклом блока, все выглядит хорошо. Кроме того, это происходило только на устройстве iPhone (3G), но работало без сбоев в симуляторе iPhone.
Результаты в 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];
}
}];