Мое приложение аварийно завершает работу, когда одно из представлений удаляется из памяти из-за нехватки памяти. По крайней мере, это то, что я понял из крашлога. Это происходит на многих экранах, но только при открытии диалогового окна Facebook (с использованием Facebook SDK). По сути, похоже, что системе иногда не хватает памяти, когда нам нужно представить диалоговое окно Facebook (например, чтобы позволить пользователю опубликовать что-то на временной шкале Facebook).
Date/Time: 2012-03-14 19:47:33.819 +0000
OS Version: iPhone OS 5.1 (9B176)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x30000008
Crashed Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x30f2bf78 objc_msgSend + 16
1 MyApp 0x00003c0e -LTBaseViewController viewDidUnload (LTBaseViewController.m:145)
2 MyApp 0x00004ea2 -LTBaseTableViewController viewDidUnload (LTBaseTableViewController.m:90)
3 UIKit 0x33766bd8 -[UIViewController unloadViewForced:] + 244
4 UIKit 0x338ae492 -[UIViewController purgeMemoryForReason:] + 58
5 Foundation 0x3071a4f8 __57-NSNotificationCenter addObserver:selector:name:object:_block_invoke_0 + 12
6 CoreFoundation 0x30e95540 ___CFXNotificationPost_block_invoke_0 + 64
7 CoreFoundation 0x30e21090 _CFXNotificationPost + 1400
8 Foundation 0x3068e3e4 -NSNotificationCenter postNotificationName:object:userInfo: + 60
9 Foundation 0x3068fc14 -NSNotificationCenter postNotificationName:object: + 24
10 UIKit 0x3387926a -UIApplication _performMemoryWarning + 74
11 UIKit 0x33879364 -UIApplication _receivedMemoryNotification + 168
12 libdispatch.dylib 0x36a12252 _dispatch_source_invoke + 510
13 libdispatch.dylib 0x36a0fb1e _dispatch_queue_invoke$VARIANT$up + 42
14 libdispatch.dylib 0x36a0fe64 _dispatch_main_queue_callback_4CF$VARIANT$up + 152
15 CoreFoundation 0x30e9c2a6 __CFRunLoopRun + 1262
16 CoreFoundation 0x30e1f49e CFRunLoopRunSpecific + 294
17 CoreFoundation 0x30e1f366 CFRunLoopRunInMode + 98
18 GraphicsServices 0x33fb6432 GSEventRunModal + 130
19 UIKit 0x336f5e76 UIApplicationMain + 1074
20 MyApp 0x00004818 main (main.m:16)
21 MyApp 0x000023b4 0x1000 + 5044
Я проверил, и утечек памяти почти нет, например. при тестировании приложения в течение часа общая утечка памяти составила около 2-3 КБ, вызванная некоторыми библиотеками копирования строк. Поэтому я не верю, что это вызвано приложением. Я предполагаю, что когда телефон не перезагружается в течение некоторого времени, в фоновом режиме работают приложения, а при использовании Facebook SDK память становится проблемой, и система пытается восстановить память из случайных приложений, включая мое приложение.
У меня вопрос, как я могу предотвратить этот сбой? Как мне обрабатывать unloadViewForced на контроллере представления, чтобы сделать приложение более надежным в условиях нехватки памяти? И, наконец, прав ли я в том, что этот аварийный журнал предполагает, что сбой произошел из-за того, что система пыталась освободить память, а мое приложение не обработало это должным образом?
Любая помощь очень ценится.
LTBaseViewController.m:145
. Это указывает на то, что проблема возникает в строке 145 «LTBaseViewController.m». (Однако, если исходный код изменился с момента создания трассировки стека, они могут быть другими.) 20.03.2012foo.m:123
— это ссылка на строку 123 файлаfoo.m
, тогда как смещение представляется как + смещение. Вы можете увидеть это, создав случай сбоя теста, выполнив что-то вроде выпуска только что созданного объекта и вызова одного из его методов в iOS 4.x, а затем используяbt
в отладчике. 22.03.2012