2012-03-19 49 views
0

由於內存不足導致其中一個視圖從內存中清除時,我的應用程序崩潰。至少這是我從crashlog中瞭解到的。它發生在無數的屏幕上,但只有在打開Facebook對話框(使用Facebook SDK)時纔會發生。基本上,當我們需要展示Facebook對話框時(例如,讓用戶在Facebook時間軸上發佈內容),系統看起來有時會耗盡內存。當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-3Kb。所以我不認爲這是由應用程序造成的。我想,當手機沒有重新啓動一段時間後,應用程序會在後臺運行,並且在使用Facebook SDK時,內存會成爲問題,系統會嘗試從隨機應用程序(包括我的應用程序)中恢復內存。

我的問題是,我怎樣才能防止這種崩潰發生?我應該如何在視圖控制器上處理unloadViewForced以使應用程序在低內存條件下更健壯?最後,我說的是,這個crashlog表明發生了崩潰,因爲系統試圖釋放內存,而我的應用程序沒有正確處理它?

任何幫助非常感謝。

+0

當您在模擬器中運行它並使用「模擬內存警告」菜單項時,是否也會發生此崩潰? – ThomasW 2012-03-19 09:57:01

+0

沒試過,不知道這個功能。將盡力找出答案。感謝這個提示。 – Amiramix 2012-03-19 10:11:30

+0

不,它不會:(我們不會在應用程序中的任何地方處理didReceiveMemoryWarning。在模擬器上的菜單中單擊該選項只會在控制檯上打印一條消息,除此之外什麼也不做。 – Amiramix 2012-03-19 10:25:03

回答

1

什麼是最有可能發生的是,被提及的一個對象,可能正在釋放LTBaseViewController viewDidUnload方法正在雙倍釋放。事實上,由於回溯表明崩潰正在LTBaseViewController.m的第145行上發生,您應該能夠快速查看哪個對象是罪魁禍首。

+0

忘記提及應用程序中的內存由ARC管理。所以沒有人工釋放物體。另外,我不相信這個函數右邊的數字是這條線。例如。 LTBaseViewController在我的代碼中沒有viewDidUnload,因此它正在調用父實現。這從函數的開始處以字節偏移。我需要使用交織代碼指令編譯爲彙編程序以查明問題發生在哪一行,但我不確定MAC上的結果如何。 – Amiramix 2012-03-19 10:07:42

+0

LTBaseViewController.m的第145行是什麼? (不是LTBaseTableViewController.m)。 – ThomasW 2012-03-19 10:45:30

+0

方法viewWillAppear的閉合子句'}'。 – Amiramix 2012-03-19 11:28:42

相關問題