CFRunLoopRun() и NSTimer → ошибка сегментации

107
14

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


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


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

то я вызываю CFRunLoopRun(), чтобы мой демон оставался в живых.


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

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

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


Теперь проблема в том, что после срабатывания таймера я получаю segfault.
Ь:


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) on (g)?

спросил(а) 2011-03-26T04:24:00+03:00 9 лет, 6 месяцев назад
1
Решение
97

Мое предположение, что ваш селектор не имеет нужного формата... должен иметь аргумент NSTimer, поэтому ваш селектор должен иметь в нем ":", поэтому @selector (use3GviaSysctl:).


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


#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 $./climac

2011-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] Таймер уволен

ответил(а) 2011-03-26T04:48:00+03:00 9 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема