Сбой на iOS, когда система очищает память и закрывает UIViewController - PullRequest
0 голосов
/ 19 марта 2012

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

Любая помощь очень ценится.

1 Ответ

1 голос
/ 19 марта 2012

Скорее всего, происходит то, что один из объектов, на которые ссылаются и, вероятно, освобождают методом LTBaseViewController viewDidUnload, освобождается вдвойне.Фактически, поскольку обратная трассировка указывает на то, что сбой произошел в строке 145 LTBaseViewController.m, вы должны быть в состоянии быстро увидеть, какой объект является виновником.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...