2012-03-19 3 views
0

메모리 부족으로 인해 뷰 중 하나가 메모리에서 제거 될 때 내 애플리케이션이 충돌합니다. 적어도 이것은 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가 시스템이 메모리를 비우려고했기 때문에 충돌이 발생했다는 것과 시스템이 제대로 처리하지 못했음을 알리는 것이 맞습니까?

도움을 주시면 감사하겠습니다.

+0

시뮬레이터에서 실행하고 "시뮬레이션 메모리 경고"메뉴 항목을 사용하면이 충돌이 발생합니까? – ThomasW

+0

시도하지 않았지만이 기능에 대해 몰랐습니다. 찾으려고 노력할 것입니다. 이 힌트를 가져 주셔서 감사합니다. – Amiramix

+0

아니요, 우리는 응용 프로그램에서 didReceiveMemoryWarning을 처리하지 않습니다. 시뮬레이터의 메뉴에서 해당 옵션을 클릭하면 콘솔에 메시지가 출력되고 그 외에는 아무 것도 수행하지 않습니다. – Amiramix

답변

1

가장 많이 발생하는 일은 LTBaseViewController viewDidUnload 메서드에 의해 참조되고 아마도 해제되는 개체 중 하나가 두 번 릴리스된다는 것입니다. 사실, 백 트레이스는 LTBaseViewController.m의 145 행에서 충돌이 발생했기 때문에 어떤 객체가 범인인지 신속하게 확인할 수 있어야합니다.

+0

응용 프로그램의 메모리가 ARC에 의해 관리된다는 점을 잊어 버렸습니다. 따라서 객체를 수동으로 릴리즈 할 필요가 없습니다. 또한 함수의 오른쪽에있는 숫자가 선이라고 생각하지 않습니다. 예 : 내 구현 코드에서 LTBaseViewController의 viewDidUnload가 없으므로 상위 구현을 호출합니다. 이것은 함수의 시작 부분에서 바이트 단위로 오프셋됩니다. 문제가 발생한 줄을 알아 내기 위해 인터리브 된 코드 명령어를 사용하여 어셈블러로 컴파일해야하지만 MAC에서 어떻게 수행되는지는 잘 모르겠습니다. – Amiramix

+0

LTBaseViewController.m의 라인 145는 무엇입니까? (LTBaseTableViewController.m이 아님). – ThomasW

+0

viewWillAppear 메서드의 '}'절을 닫습니다. – Amiramix

관련 문제