#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 . Это дает вам представление о природе ошибки.