문제

저는 C++ 15년 베테랑이고 iPhone의 메모리 문제를 쉽게 처리할 수 있다고 생각했습니다.그러나 나는 여러 차례에 걸쳐 이 새로운 환경에 겸손해졌습니다.여기에 내 문제가 있습니다.질문이 올바르게 이루어지기를 바랍니다.

기본적으로 나는 appdelegate에서 공통 객체의 변경 가능한 배열을 유지하고 있습니다.이는 여러 다른 뷰에서 사용되는 개체 컬렉션을 유지 관리하기에 적합한 장소인 것 같습니다.그러나 뷰를 생성하여 탐색 컨트롤러에 푸시하는 시간과 뷰가 해당 값을 사용하기 시작하는 시간 사이에 개체를 생성한 메모리의 위치가 다른 값으로 가득 차게 됩니다.

참조 횟수가 정확한지 확인하기 위해 모든 코드를 검토했지만 아무것도 찾지 못했습니다.그래서 객체가 여전히 존재하지만 쿵쿵거리는 소리가 계속된다는 것을 보장하기 위해 모든 "릴리스" 호출을 주석 처리했습니다.

내 질문은 이것입니다 ...내 기억을 방해할 수 있는 뷰를 "푸시"할 때 알아야 할 일이 발생하고 있습니까?사용자가 뷰 컨트롤러를 할당 초기화한 다음 포함된 탐색 컨트롤러에 대해 "pushViewController"를 수행하는 버튼을 누릅니다.다음 줄에서 내 객체가 생성되었는지 확인하고 메모리를 추적합니다.불행하게도 버튼 이벤트가 "PurpleEventCallback"으로 풀리면서 메모리가 중단됩니다.

이것이 누구에게나 이해가 됩니까?내 기억을 무효화시키는, 일반적으로 알려지지 않은 내 견해에 무슨 일이 일어나고 있는 걸까요?

도움이 되었습니까?

해결책

SO에 오신 것을 환영합니다!당신은 모든 일을 제대로 하고 있는 것 같습니다.유지/해제 때문에 문제가 발생하지 않는지 확인하려면 뷰 컨트롤러를 푸시하기 전에 배열 구조를 다시 유지해 보세요.일부 생성자는 유지 횟수가 1인 객체를 반환하고 다른 생성자는 유지 횟수가 0인 자동 해제된 객체를 반환한다는 점을 기억하세요.일반적으로 "new", "create" 또는 "alloc"으로 시작하는 모든 함수는 보유 개수가 +1인 개체를 반환합니다.기타 편의 기능 [NSMutableArray arrayWithCapacity:] 그리고 [NSString stringWithFormat:] 자동 해제되었으며 보유 횟수가 0인 개체를 반환합니다.이러한 객체에 대한 포인터를 유지하면 런 루프가 항목을 정리하면서 무작위로 사라질 것입니다.

"좀비" 기술을 사용하여 디버깅하는 방법을 살펴볼 수도 있습니다.무작위로 받기 시작할 때 매우 유용합니다. EXE_BAD_ACCESS 오류.자세한 내용은 이 페이지를 확인하세요. http://www.cocoadev.com/index.pl?NSZombieEnabled

해당 기사에서:"...좀비를 활성화하면 할당 해제된 개체에 대한 메시지가 더 이상 이상하게 작동하거나 이해하기 어려운 방식으로 충돌하지 않고 대신 메시지를 기록하고 예측 가능하고 디버거 중단점이 가능한 방식으로 종료됩니다.이는 초과 릴리스 및 조기 릴리스를 추적하려고 할 때 사용하는 도구입니다."

도움이 되었기를 바랍니다!

다른 팁

이전에 Cocoa의 자동 릴리스 풀 개념에 대해 읽지 않았을 수도 있습니다.객체를 자동 릴리스하면 객체 릴리스가 현재 이벤트 주기가 끝날 때까지(또는 자동 릴리스 풀이 소모될 때마다) 연기됩니다.

자동 릴리스가 문제인지 확인하려면 환경 변수를 설정하십시오. NSEnableAutoreleasePool 에게 "NO".문제가 해결되면 자동 릴리스가 문제가 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top