Вызов super в реализации блока Objective-C

Поддерживается ли вызов метода на 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];
 }
}];
11
задан Monolo 24 December 2011 в 15:16
поделиться