NSRunLoop runUntilDate вызывает сбой приложения

#objective-c #macos #cocoa #osx-snow-leopard #nsrunloop

#objective-c #macos #какао #osx-snow-leopard #nsrunloop

Вопрос:

У меня есть приложение, которое работает в течение нескольких дней и недель на сервере Snow Leopard. Он используется -[NSRunLoop runUntilDate:] для «приостановки» на десять секунд, выполнения своей задачи и затем повторной паузы. После запуска в течение более одного часа мое приложение выходит из строя со следующим отчетом:

Отчет о сбое

 Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000013
Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Application Specific Information:
objc_msgSend() selector name: release

Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                 0x00007fff84cfef0c objc_msgSend   40
1   com.apple.CoreFoundation        0x00007fff84e363d1 __CFRunLoopDoSources0   1361
2   com.apple.CoreFoundation        0x00007fff84e345c9 __CFRunLoopRun   873
3   com.apple.CoreFoundation        0x00007fff84e33d8f CFRunLoopRunSpecific   575
4   com.apple.Foundation            0x00007fff83e73b74 -[NSRunLoop(NSRunLoop)  runMode:beforeDate:]   270
5   com.apple.Foundation            0x00007fff83ebf19a -[NSRunLoop(NSRunLoop) runUntilDate:]   78
  

На первый взгляд я подумал, что мой NSRunLoop объект больше недействителен, и поэтому release сообщение глубоко внутри CF вызывает сбой. Однако я не думаю, что это так, поскольку
Я получаю ссылку на currentRunLoop объект в предыдущей строке.

Время сбоя варьируется от 1 до 1,5 часов, но я не могу понять, что его вызывает. Любые комментарии, мнения или идеи по отладке будут с благодарностью приняты, поскольку я не уверен, что делать дальше.

РЕДАКТИРОВАТЬ: решение проблемы — пожалуйста, смотрите Мой ответ ниже

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

1. Можете ли вы опубликовать некоторый код из метода сбоя?

Ответ №1:

Дальнейшие тесты позволили мне ответить на мой собственный вопрос:

В цикле выполнения нет ничего плохого. Это цикл выполнения, который обрабатывает, что освобождает объекты в пуле авторелиза, и именно поэтому проблемы из любой части кода могут быть связаны с циклом выполнения.

В моем случае у меня был объект, который не был очищен должным образом. При нормальных обстоятельствах эта проблема обнаружилась бы во время тестирования утечки памяти. Однако эта конкретная проблема возникла только при фактической установке клиента, когда SMTP-сервер вернул неожиданное сообщение об ошибке, из-за которого объект был «оставлен», и когда цикл выполнения в конечном итоге попытался его очистить, он остановился.

Короткий ответ

Сбои в цикле выполнения могут быть вызваны любым объектом в коде. Попробуйте воссоздать сценарий проблемы и проверить наличие утечек памяти, чтобы найти нарушителя.

Ответ №2:

Я знаю, что это точно не отвечает на ваш вопрос, но…

Я не уверен, что это вариант, поскольку нет примера кода, но рассматривали ли вы NSTimer? Они очень просты в использовании для выполнения кода каждые n секунд.

 self.myTimer = [NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(timerTarget:) userInfo:nil repeats:YES];
  

где MyTimer — это свойство NSTimer вашего класса.

когда вы закончите, и больше не хотите никаких вызовов.

 [self.myTimer invalidate];
self.myTimer = nil;
  

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

1. Спасибо — я знаю о NSTimer и использую его в других приложениях. Это, безусловно, одно из решений, но я бы предпочел выяснить, что не так с NSRunLoop или, может быть, что-то еще в моем коде.