2011-06-11 4 views
16

iPhone 프로젝트를 진행 중입니다. 이제 다른 UIViewController에서 새 UIViewController를 시작한 다음 두 UIViewController간에 전환합니다. 여기 내 코드가있다.오브젝트가 해제 된 후 수정되었을 가능성이 있음

iGreenAppDelegate *delegate = [UIApplication sharedApplication].delegate; 
if(checkInViewController) { 
    [checkInViewController release]; 
    checkInViewController = nil; 
} 
checkInViewController = [[CheckInViewController alloc] initWithCheckpoint:checkpoint]; 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.8]; 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:[delegate window] cache:YES]; 
[[delegate rootTabBarController].view removeFromSuperview]; 
[[delegate window] addSubview:checkInViewController.view]; 
[UIView commitAnimations]; 

두 번째로 UIViewController를 초기화 할 때 문제가 발생하여 메모리 누수가 발생하지 않도록하고 싶습니다. 디버거는

iGreen (916,0x3f60348c)의 malloc를 표시 객체 0x130350에 대한 오류 : 잘못된 체크를 해제 개체에 대해 - 객체가 아마 해제 후 수정되었습니다. 디버깅을 위해 malloc_error_break에 중단 점을 설정하십시오.

다른 부분의 유사한 코드가 이러한 오류를 반환하지 않기 때문에 이상합니다. 또한 autorelease를 시도했지만 프로그램이 즉시 중단되고 Debugger에 최종 레이어가 수정된다고 나와 있습니다.

나는 밤새 문제를 해결하기 위해 노력해 왔지만 여전히 혼란 스럽다.

+0

, 나는이의 ViewController를 해제하지 않는 경우, 프로그램은 잘 작동하지만 나는 그것을 해결하는 좋은 방법이라고 생각하지 않습니다. 아무도 내가 문제를 찾을 수 있도록 도와 주시겠습니까 – Stone

+0

그냥이 코드 조각에서 코드에서 진행되는 일을 따라하기는 어렵지만 일반적으로보기 컨트롤러를 할당하고 탭바 컨트롤러에 추가 한 다음보기 컨트롤러를 해제하면됩니다. 탭바 어 컨트롤러는 뷰 콘트롤러를 유지하므로 바로 붙습니다. 탭바 컨트롤러가 끝나기 전에 그걸 풀어주는 것처럼 보입니다. 어쩌면이 질문에 더 명확한 코드를 추가 할 수 있습니까? –

+0

initWithCheckpoint 구현을 추가 할 수 있습니까? 또한 Xcode 메뉴에서 빌드하고 분석해 보셨습니까? – AmineG

답변

18

디버깅 할 malloc_error_break에 중단 점을 설정하십시오.

역 추적을하고 게시하십시오.

일반적으로 이는 메모리가 손상되었음을 의미하지만, 과도하게 릴리스 된 개체가 있음을 나타낼 수도 있습니다. 빌드 및 분석도 시도해보십시오.

+8

그리고 어떻게해야합니까? malloc_error_break에 어떻게 중단 점을 설정합니까? –

+34

@ JCLeitão 실행> 중단 점> 심볼 브레이크 포인트 추가> "malloc_error_break"넣기 – geekazoid

+2

@geekazoid, 고맙습니다. 다른 사람들에게도 도움이 될 것입니다. :) –

3

오류 메시지 이해 : 해제 한 후에 개체를 계속 사용하고 수정하는 중입니다. 이 코드는 그 코드를 해제하고 그 코드를 수정하지 않지만 이미 사용중인 코드가 무엇인지 계속 묻습니다.

이 스 니펫의 코드가 실행될 때마다 기존 checkinViewController를 해제 (해제)하고 새 CheckoutViewController를 할당하므로 명확하게 이전 항목을 다시 건 드리지 않습니다. 그러나 누가 그 이전 객체에 대한 포인터를 가질 수 있습니까?

"[[위임 창] addSubview : checkInViewController.view];"를 통해 참조를 가져 오는 가능한 다른 코드 및 가능하면 [위임 창]? 후자는 자체 참조를 취합니다. 즉, 릴리스가 즉시이를 해제하지 않음을 의미합니다.

하지만 참조를 추가하지 않고 포인터를 복사하는 데주의하십시오. 어딘가에서 그리고 다른 곳에서 (예 : 위의 스 니펫과 같이) 누군가가 같은 포인터에서 release를 호출하면 이제 해제 된 객체에 대한 포인터를 가질 수 있습니다.

1

코드에서 현명한 디자인으로 잘못 처리되는 몇 가지 사항이 있습니다. 먼저 수퍼 뷰에서 뷰를 제거하지 않고 checkInViewController를 해제 한 다음 컨트롤러에 아무 것도하지 않고 수퍼 뷰에서 rootTabBarController 뷰를 제거하고 checkInViewController를 rootTabBarController 또는 rootViewController 속성에 추가하지 않습니다. 그래서 창은 현재 공중에 있습니다. 이 (현재) 객체의 할당이 해제되었지만 checkInViewController의 뷰가 윈도우에 그대로 유지되면 어떻게됩니까? 당신이 당신의 checkInViewController를 해제하지만보기가 여전히 창에 의해 유지되면, 아마 몇 가지 문제를 만들 것입니다

... 오류에 대한

, 나는 약한 참조 (유지하지 않음)에 어딘가에 있다고 생각 그것이 해방 된 후에 그것에 작용하는 당신의 물건.

9

malloc_error_break에서 중단 점을 설정하는 것 외에도 xCode에서 Command-6을 눌러 중단 점 탭으로 이동하고 체계에서 malloc 보조 기능을 활성화하십시오.

스키마 선택기로 이동하여 "구성표 편집"을 선택하고 "실행"대상을 찾은 다음 "진단"탭으로 이동하십시오. 메모리 관리 아래에서 낙서, 보호 모서리, 가드 malloc 및 좀비 개체를 사용할 수 있습니다.

약간의 행운을 빕니다 xCode는 할당 된 메모리 밖에 쓰고 메모리를 손상시킬 수 있습니다.

그것은 메모리를 다루는 성인 감독처럼 ... 그런데

+0

성능을 죽이고, 그만한 가치가 있기를 바랍니다. 시도 중 ... :) – Narek

+0

디버깅하는 동안 성능을 죽이는 것은 버그를 찾기 위해 나에게 도움이 될 것 같습니다. –

관련 문제