CFRunLoopRun () и NSTimer -> ошибка сегментации - PullRequest
0 голосов
/ 26 марта 2011

Заранее спасибо всем, кто мне помогает.

У меня простой демон.Я выделяю класс и затем запускаю запланированный и повторяющийся NSTimer:

[NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(usage3GviaSysctl) userInfo:nil repeats:YES];

, затем вызываю CFRunLoopRun (), чтобы мой демон остался жив.после того, как таймер срабатывает, я получаю ошибку.bt:

objc_msgSend
__NSFireTimer
__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
__CFRunLoopDoTImer
__CFRunLoopRun
CFRunLoopRunSpecific

и другие способы запуска таймера тоже не сработали.например:

NSTimer *timeUpdateTimer = [[NSTimer alloc] initWithFireDate:[NSDate date] interval:1 target:self selector:@selector(usage3GviaSysctl) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:timeUpdateTimer forMode:NSDefaultRunLoopMode];

Кто-нибудь знает, что происходит (wr) на (g)?

1 Ответ

0 голосов
/ 26 марта 2011

Полагаю, ваш селектор не имеет правильного формата ... должен иметь аргумент NSTimer, поэтому у вашего селектора должен быть ":", поэтому @selector (creation3GviaSysctl:).

... Я попробовал это сам и, кажется, работает, так что вот мой код на случай, если это было что-то другое:

#import <Foundation/Foundation.h>

@interface NMDaemonHelper : NSObject {
    NSTimer *_aTimer;
}
- (void)startNotificationServer;
@end

@implementation NMDaemonHelper

- (void)dealloc {
    [_aTimer invalidate];
    [super dealloc];
}

- (void)startNotificationServer {
    _aTimer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(usage3GviaSysctl:) userInfo:nil repeats:YES];
}

- (void)usage3GviaSysctl:(NSTimer *)aTimer {
    NSLog(@"timer fired");
}

@end

void SIGTERM_handler(int signum) {
    NSLog(@"SIGTERM_handler");
}

int main(int argc, char *argv[]) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    signal(SIGTERM, (sig_t)SIGTERM_handler);

    NMDaemonHelper *helper = [[NMDaemonHelper alloc] init];
    [helper startNotificationServer];
    CFRunLoopRun();

    [helper release];
    NSLog(@"NMDAEMON: will exit");
    [pool release];
    return 0;
}

... и вывод:

pho0 $ ./climac2011-03-25 18: 43: 36.723 Climac [2833: 903] сработал таймер2011-03-25 18: 43: 39.723 Climac [2833: 903] сработал таймер2011-03-25 18: 43: 42.722 Climac [2833: 903] сработал таймер2011-03-25 18: 43: 45.722 Climac [2833: 903] сработал таймер2011-03-25 18: 43: 48.722 Climac [2833: 903] сработал таймер2011-03-25 18: 43: 51.722 Climac [2833: 903] сработал таймер

...