메모리 부족으로 인해 뷰 중 하나가 메모리에서 제거 될 때 내 애플리케이션이 충돌합니다. 적어도 이것은 crashlog에서 내가 이해하는 것입니다. 페이스 북 대화창을 열 때만 (페이스 북 SDK 사용) 수많은 스크린에서 발생합니다. 기본적으로 페이스 북 대화창을 제시해야 할 때 (예 : 페이스 북 타임 라인에 사용자가 뭔가를 게시 할 수 있도록) 시스템에 메모리가 부족한 것처럼 보입니다.시스템이 메모리를 제거하고 UIViewController를 닫을 때 iOS에서 충돌이 발생합니다.
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
확인했는데 메모리 누수가 거의 없습니다. 1 시간 동안 앱을 테스트 할 때 누출 된 총 메모리는 일부 문자열 복사 라이브러리로 인해 약 2-3Kb였습니다. 그래서 나는 이것이 응용으로 인한 것이라고 생각하지 않습니다. 내 생각에 전화가 백그라운드에서 실행되는 응용 프로그램이 있고 Facebook SDK를 사용할 때 메모리가 문제가되고 시스템이 응용 프로그램을 포함한 임의의 응용 프로그램에서 메모리를 복구하려고하면 얼마 동안 응용 프로그램이 다시 시작되지 않는다고 생각합니다.
제 질문은이 충돌을 어떻게 막을 수 있습니까? 메모리 부족 상태에서 앱을보다 강력하게 만들려면 뷰 컨트롤러에서 unloadViewForced를 어떻게 처리해야합니까? 그리고 마지막으로,이 crashlog가 시스템이 메모리를 비우려고했기 때문에 충돌이 발생했다는 것과 시스템이 제대로 처리하지 못했음을 알리는 것이 맞습니까?
도움을 주시면 감사하겠습니다.
시뮬레이터에서 실행하고 "시뮬레이션 메모리 경고"메뉴 항목을 사용하면이 충돌이 발생합니까? – ThomasW
시도하지 않았지만이 기능에 대해 몰랐습니다. 찾으려고 노력할 것입니다. 이 힌트를 가져 주셔서 감사합니다. – Amiramix
아니요, 우리는 응용 프로그램에서 didReceiveMemoryWarning을 처리하지 않습니다. 시뮬레이터의 메뉴에서 해당 옵션을 클릭하면 콘솔에 메시지가 출력되고 그 외에는 아무 것도 수행하지 않습니다. – Amiramix