iPhone - объект больше не поддерживает известный селектор при вызове NSTimed - PullRequest
1 голос
/ 25 апреля 2011

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

- (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, и я использую этот атрибут во многих местах.
страница не равна нулю в хронированном методе.
Self.webViews - это сохраненный NSMutableArray.

1 Ответ

2 голосов
/ 25 апреля 2011

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

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

</p>

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

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

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

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

...