UIViewController purgeMemoryForReason: Crashing on iOS 5

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

17
задан Ash Furrow 7 January 2012 в 22:12
поделиться

1 ответ

Я думаю, что решил проблему. Я думал об этом, и проблема не в выгрузке представления UIViewController, а в публикации фактического предупреждения о нехватке памяти. В моем коде есть несколько случаев, когда я звоню [[NSNotificationCenter defaultCenter] removeObserver:self]. Это хорошо в методе dealloc, но в методах viewDidUnload было два таких случая.

Я заметил это, когда моя точка останова в didReceiveMemory одного из UIViewController не была достигнута. Код в viewDidUnload также отменял регистрацию self в других системных уведомлениях, как подробно описано здесь .

Я не собираюсь отмечать это как принятый ответ, пока не проверю, что сбои прекращаются с новым обновлением.

ОБНОВЛЕНИЕ: Я проверил с помощью Crashlytics, что проблема была исправлена!

17
ответ дан 30 November 2019 в 13:11
поделиться