ios - 해제 된 후 개체가 수정되었을 수 있습니다.




memory-management autorelease (3)

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

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

운이 좋으면 xCode는 할당 된 메모리 밖에서 쓰거나 메모리를 손상시킬 수 있습니다.

그것은 기억을 다루는 성인 감독과 같습니다 ...

나는 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에 최종 레이어가 수정된다고 나와 있습니다.

나는 밤새도록 문제를 해결해 왔고 여전히 혼란 스럽다.


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

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

아마도 당신이 작성한 다른 코드 일 수도 있고 [delegate window], "[[delegate window] addSubview : checkInViewController.view];"를 통해 참조를 얻을 수도 있습니다. 후자는 자체 참조를 취합니다. 즉, 릴리스가 즉시이를 해제하지 않음을 의미합니다.

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


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

그렇게하고 백 트레이스를 게시하십시오.

일반적으로 이는 메모리를 손상 시켰음을 의미하지만, 너무 많이 릴리스 된 객체가 있음을 의미 할 수도 있습니다. 빌드 및 분석도 시도해보십시오.





autorelease