NSRunloop runUntilDate вызывает сбой приложения - PullRequest
4 голосов
/ 19 октября 2011

У меня есть приложение, которое работает в течение нескольких дней и недель на сервере 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 часов, но я не могу справиться с этимчто вызывает этоБудем весьма благодарны за любые комментарии, мнения или идеи по отладке, поскольку я не уверен, что делать дальше.

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

Ответы [ 2 ]

4 голосов
/ 20 октября 2011

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

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

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

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

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

4 голосов
/ 19 октября 2011

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

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

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

, где myTimer - это свойство NSTimer вашего класса.

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

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