2012-03-19 1 views
0

Мое приложение разбивается, когда одно из представлений очищается из памяти из-за состояния с низкой памятью. По крайней мере, это то, что я понимаю из краш-журнала. Это происходит на многих экранах, но только при открытии диалогового окна Facebook (используя SDK для Facebook). В принципе, похоже, что в системе иногда заканчивается память, когда нам нужно представить диалог в Facebook (например, чтобы пользователь мог опубликовать что-то на временной шкале Facebook).Crash on iOS, когда система очищает память и закрывает UIViewController

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

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

+0

Этот крах также возникает, когда вы запускаете его в симуляторе и используете пункт меню «Имитация памяти»? – ThomasW

+0

Не пробовал, не знал об этой функции. Постараюсь выяснить. Спасибо за этот намек. – Amiramix

+0

Нет, это не так :(Мы не обрабатываем didReceiveMemoryWarning в любом месте приложения. Нажатие этой опции в меню на симуляторе только печатает сообщение на консоли и ничего не делает кроме этого. – Amiramix

ответ

1

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

+0

Забыл упомянуть, что память в приложении управляется ARC. Таким образом, отсутствует ручное освобождение объектов. Кроме того, я не верю, что число, которое находится справа от функции, является линией. Например. в моем коде отсутствует viewDidUnload в LTBaseViewController, поэтому он вызывает родительскую реализацию. Это смещение в байтах от начала функции. Мне нужно было бы скомпилировать ассемблер с чередующимися инструкциями кода, чтобы выяснить, в какой строке возникла проблема, но я не уверен, как это сделать на MAC. – Amiramix

+0

Что находится в строке 145 LTBaseViewController.m? (Не LTBaseTableViewController.m). – ThomasW

+0

Закрывающее предложение '}' метода viewWillAppear. – Amiramix