#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 или, может быть, что-то еще в моем коде.