2013-02-26 4 views
2
- (NSDictionary*)convertMessage:(Message*)event 
{ 
    // if this gets called then a derived class either didn't override this function or it called [super convertEvent:event] 
    [self doesNotRecognizeSelector:_cmd]; 
    return nil; 
} 

Ожидается, что значение результата будет равно нулю.Непризнанный Селектор для вызова метода

-(void)calling{ 

NSDictionary *dictionary = [self convertMessage:evt]; 

} 

Но его высказывание непризнанного селектора отправлено в экземпляр для блока ошибок! при работе!

ответ

2

Реализация [self doesNotRecognizeSelector:_cmd] - это исключение. поэтому ожидаемый результат - это исключение. если вы ожидаете ноль возврата, а затем просто возвращать ноль в методе и сделать не вызов doesNotRecognizeSelector:

см apple's doc

Исполняющая система вызывает этот метод, когда объект получает aSelector сообщение возможное отвечать или переходить. Этот метод, в turn, вызывает исключение NSInvalidArgumentException и генерирует сообщение об ошибке .

Любое doesNotRecognizeSelector: сообщения, как правило, отправляются только системой времени выполнения . Однако они могут использоваться в программном коде для предотвращения наследования метода . Например, подкласс NSObject может отказаться от копирования или инициализации метода путем повторного осуществления его включить doesNotRecognizeSelector: сообщение следующим образом:

- (id)copy { 
    [self doesNotRecognizeSelector:_cmd]; 
} 

_cmd переменная скрытый аргумент, передаваемый каждый метод, который является текущим селектором;

В этом примере он определяет селектор для метода копирования. Этот код запрещает экземплярам подкласса отвечать на копии сообщений или суперклассов при отправке копий сообщений, хотя отвечает на запрос: все равно сообщит, что получатель имеет доступ к методу копирования.

Если вы переопределите этот метод, вы должны вызвать супер или поднять исключение NSInvalidArgumentException в конце вашей реализации . Другими словами, этот метод не должен возвращаться нормально, он всегда должен вызывать исключение.

+0

так что это всегда исключает! который является NSInvalidArgumentException – Kiran

+0

да. это то, что должно произойти при вызове нереализованного селектора –

+0

спасибо за информацию, которая помогает моей переоценке. Я принимаю вас ответ – Kiran

2

Чтобы продлить на @ xlc0212 отвечают:

Оригинальная реализация метода ...

[self doesNotRecognizeSelector:_cmd]; 
return nil; 

... никогда не ожидается, достигнет return заявление. Как объяснено в @ xlc0212 doesNotRecognizeSelector, выдается исключение, приводящее к ненормальному завершению процесса.

Автор реализации только поместил там заявление return, чтобы отключить предупреждение компилятора.Более современный и менее запутанный способ сделать это - сказать, что эта точка в коде не может быть достигнута:

- (NSDictionary*)convertMessage:(Message*)event 
{ 
    [self doesNotRecognizeSelector:_cmd]; 
    __builtin_unreachable(); 
} 
+0

спасибо nikolai Ruhe !!! – Kiran

Смежные вопросы