2011-11-26 5 views
1

좀비를 사용하여 EXC_BAD_ACCESS 오류를 제거하려고합니다. 0x8955310 :Xcode에서 좀비 사용

객관적인-C 메시지가 주소에 할당이 해제 된 객체 (좀비)에 보내졌다 - 응용 프로그램 충돌이 때 좀비에서

, 나는이 메시지를 받았습니다.

내 질문은 다음 문제 해결을 위해 무엇을해야합니까?

+0

가능한 복제본 [Xcode에서 NSZombie를 활성화하는 방법] (http://stackoverflow.com/questions/5386160/how-to-enable-nszombie-in-code) –

+0

질문이 명확하지 않습니다. '문제 해결을 위해 내가해야할 일'은 다양한 방식으로 해석 될 수있다. 다시 말해주세요. – JAM

답변

4

Xcode에서 자신의 구성표에 대한 malloc 스택 로깅과 좀비를 켜고 시뮬레이터에서 앱을 실행하십시오. Xcode는 메시지가 좀비에게 보내질 때 디버거에 들어가야합니다. 디버거 프롬프트에서이 명령을 실행

info malloc 0x8955310 

이 (좀비의 실제 주소를 대체!) 당신은 그 주소 할당 및 해제 할 때부터 스택 트레이스를 얻을 수 있습니다.

+0

나는 정말로 어리석은 질문을 가지고있다. 정확히 어디에 malloc_history 명령을 실행해야 하는가? PID 0xADDRESS | 적게. 터미널에? –

+0

gdb의 내장 malloc 히스토리 지원을 사용하기 위해 제 대답을 변경했습니다. –

1

대부분의 경우 개체를 만들고 릴리스 한 다음 나중에 메시지를 보냈습니다. 이것은 당신이 고려 그것을

사용하여 수행되면, 안전한 연습 nil에 개체를 설정하는 것입니다 일어나지 않을 것입니다 있는지 확인하기 위해

:

NSMutableArray *a = [NSmutableArray array]; 
[a dealloc]; 
[a do_something_weird]; 

앱 가능성이 충돌입니다 (원 't 항상 크래시)이 메시지에 대한 응답으로, 릴리스 이후에이 메모리를 소유하지 않으며 다른 객체에 의해 사용될 수 있습니다. 당신이

NSMutableArray *a = [NSmutableArray array]; 
[a dealloc]; 
a=nil; 
[a do_something_weird]; 

이 순서를 변경하는 경우

정확히 아무것도 일어나지 않습니다. 이것은 개체 사용을 마쳤다고 확신 할 때 따라야 할 안전한 방법입니다.

Automatic Reference Counting 기능을 사용하면 메모리 관리에 많은 도움이됩니다.

+0

안녕하세요 @ JAM, 나는이 문제를 만난 코드에서 객체 (주소가 0x8955310 임)를 얻는 방법을 묻고 있다고 생각합니다. :) – Kjuly

+0

나는 "문제를 해결하기 위해 다음에해야 할 일"이 더 많은 한 가지 방법으로 해석 될 수 있다고 가정합니다. – JAM

+0

아하, 당신 말이 맞아요. 나는 당신의 대답이 그 물건을 얻은 후에 해결책이라고 확신합니다. : D – Kjuly