iPhone — объект больше не поддерживает известный селектор при вызове NSTimed

#iphone #parameters #crash #selector #nstimer

#iPhone #параметры #сбой #селектор #nstimer

Вопрос:

Я установил таймер для сброса атрибута объекта :

 - (IBAction)open:(id)sender {
    int viewID = ((UIButton*)sender).tag;

    for (int i=0; i<[self.webViews count]; i  ) {
        WebViewController* page = [self.webViews objectAtIndex:i];
        if (page.loadFinished == NO) {
            [page.webView stopLoading];
            [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(setLoadingNotFinished:) userInfo:page repeats:NO];   
        }
    }


- (void) setLoadingNotFinished:(WebViewController*)page {
    page.loadFinished = NO;
}
  

При вводе метода setLoadingNotFinished у меня возникает этот сбой :

 2011-04-25 04:34:22.358 MyApp[7823:207] -[__NSCFTimer setLoadFinished:]: unrecognized selector sent to instance 0x4b203d0
2011-04-25 04:34:22.360 MyApp[7823:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFTimer setLoadFinished:]: unrecognized selector sent to instance 0x4b203d0'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00dca5a9 __exceptionPreprocess   185
    1   libobjc.A.dylib                     0x00f1e313 objc_exception_throw   44
    2   CoreFoundation                      0x00dcc0bb -[NSObject(NSObject) doesNotRecognizeSelector:]   187
    3   CoreFoundation                      0x00d3b966 ___forwarding___   966
    4   CoreFoundation                      0x00d3b522 _CF_forwarding_prep_0   50
    5   MyApp                               0x00003a42 -[MainGridController setLoadingNotFinished:]   66
    6   Foundation                          0x007ba749 __NSFireTimer   125
    7   CoreFoundation                      0x00dab8c3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__   19
    8   CoreFoundation                      0x00dace74 __CFRunLoopDoTimer   1220
    9   CoreFoundation                      0x00d092c9 __CFRunLoopRun   1817
    10  CoreFoundation                      0x00d08840 CFRunLoopRunSpecific   208
    11  CoreFoundation                      0x00d08761 CFRunLoopRunInMode   97
    12  GraphicsServices                    0x010021c4 GSEventRunModal   217
    13  GraphicsServices                    0x01002289 GSEventRun   115
    14  UIKit                               0x0002ac93 UIApplicationMain   1160
    15  MyApp                               0x000027e9 main   121
    16  MyApp                               0x00002765 start   53
)
terminate called after throwing an instance of 'NSException'
  

Почему происходит этот сбой?
Я не понимаю, почему он не находит селектор.

Атрибут loadFinished установлен, даже первая проверка этого атрибута работает перед вызовом метода NSTimer, и я использую этот атрибут во многих местах.
страница не равна нулю в методе timed.
Self.WebViews — это сохраненный NSMutableArray.

Комментарии:

1. Пожалуйста, обратите внимание, что я исправил синтаксическую ошибку в своем коде. Теперь это правильно, но если вы использовали исходную публикацию, это было неправильно.

Ответ №1:

Пожалуйста, проверьте код еще раз. Я исправил это. В нем была синтаксическая ошибка.

Следующее должно это исправить:

- (void) setLoadingNotFinished:(NSTimer *)myTimer { WebViewController *page = (WebViewController *)[myTimer userInfo]; page.loadFinished = NO; }

Метод selector получает NSTimer в качестве своего аргумента, а не userInfo. Затем с помощью NSTimer вы извлекаете объект, который вы ранее установили в качестве userInfo.

(В вашем исходном setLoadingNotFinished страница была не WebViewController, это был NSTimer. И setLoadFinished отправлялся в NSTimer, который его не распознал.)

Обратите внимание, что в сообщении об ошибке сообщалось, что метод selector был отправлен объекту класса _NSCFTimer . Это дает вам представление о природе ошибки.