Итак, я довольно часто наблюдаю этот сбой в Crashlytics, как на iPad, так и на iPad 2 под управлением iOS 5. Похоже, что это вызвано предупреждением о нехватке памяти, но трассировка стека не ссылается ни на какой код моего приложения, только на фреймворки iOS:
0 libobjc.A.dylib objc_msgSend + 15
1 UIKit -[UIViewController purgeMemoryForReason:] + 64
2 Foundation __57-[NSNotificationCenter addObserver: selector: name: object:]_block_invoke_0 + 18
3 CoreFoundation ___CFXNotificationPost_block_invoke_0 + 70
4 CoreFoundation _CFXNotificationPost + 1406
5 Foundation -[NSNotificationCenter postNotificationName: object: userInfo:] + 66
6 Foundation -[NSNotificationCenter postNotificationName: object:] + 30
7 UIKit -[UIApplication _performMemoryWarning] + 80
8 UIKit -[UIApplication _receivedMemoryNotification] + 174
9 libdispatch.dylib _dispatch_source_invoke + 516
10 libdispatch.dylib _dispatch_queue_invoke + 50
11 libdispatch.dylib _dispatch_main_queue_callback_4CF + 156
12 CoreFoundation __CFRunLoopRun + 1268
13 CoreFoundation CFRunLoopRunSpecific + 300
14 CoreFoundation CFRunLoopRunInMode + 104
15 GraphicsServices GSEventRunModal + 156
16 UIKit UIApplicationMain + 1090
17 500px iOS main.m line 12
Я изрядно погуглил, но не могу найти никаких решений. Похоже, что это вызвано чрезмерным освобождением экземпляра UIViewController, но я использую ARC, поэтому не понимаю, как это может быть.
Я в растерянности, как вообще к этому подступиться. Я даже не могу определить, какой подкласс UIViewController вызывает проблему. Я пытался воспроизвести проблему в симуляторе и на устройстве, но не могу найти причину. Кто-нибудь сталкивался с подобным или имеет предложения о том, как подойти к воспроизведению проблемы?
Я думаю, что решил проблему. Я думал об этом, и проблема не в выгрузке представления UIViewController, а в публикации фактического предупреждения о нехватке памяти. В моем коде есть несколько случаев, когда я звоню [[NSNotificationCenter defaultCenter] removeObserver:self]
. Это хорошо в методе dealloc, но в методах viewDidUnload
было два таких случая.
Я заметил это, когда моя точка останова в didReceiveMemory
одного из UIViewController не была достигнута. Код в viewDidUnload
также отменял регистрацию self
в других системных уведомлениях, как подробно описано здесь .
Я не собираюсь отмечать это как принятый ответ, пока не проверю, что сбои прекращаются с новым обновлением.
ОБНОВЛЕНИЕ: Я проверил с помощью Crashlytics, что проблема была исправлена!