2010-08-01 3 views
2

Я немного озадачен, и я работал над этим часами и поиском без каких-либо реальных проводов. Я хочу создать обратный вызов в объекте-c для моего iPhone-приложения, используя @selector.@selector в объективе-c не ведет себя так, как ожидалось

Класс 1:

- (void) someMethod {  
    // create selector 
    SEL successCallback = @selector(successMethod); 

    // call some service with caller and selector 
    [class2 dispatchSomeEvent:self callback:successCallback]; 

    // here's the call back method 
    - (void) successMethod { 
     NSLog(@"Callback success"); 
    } 
} 

Класс 2:

// some event 
- (void) dispatchSomeEvent:(id) caller selector:(SEL) successCallback { 
    // catch the event and execute callback 
    if ([caller respondsToSelector:successCallback]) { 
     [caller successCallback]; 
    } 
} 

Условный respondsToSelector будет проходить, но обратный вызов на следующей строке потерпит неудачу. ОДНАКО, если бы я сделал так:

// catch the event and execute callback 
if ([caller respondsToSelector:successCallback]) { 
    [caller successMethod]; 
} 

Таким образом, вместо того, чтобы использовать селектор я прошел, я ввожу имя метода непосредственно ... и это работает!

Ошибки я получаю это:

непризнанного селектор послал к экземпляру 0x6c37f70

Что здесь происходит ??

Заранее благодарен!

+0

Компилятор должен извергать предупреждение, что абонент не отвечает на successMethod. – bbum

+0

Обратный вызов 'successMethod' должен давать вам синтаксическую ошибку, если этот код является дословным. Вы не можете определять методы внутри других методов. – JeremyP

ответ

3

Вы должны вызвать свой выбор, используя -performSelector метод:

if ([caller respondsToSelector:successCallback]) { 
    [caller performSelector:successCallback]; 
} 
+0

Ничего. Я был плотным. :) – bbum

+0

Спасибо, Владимир. –

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