2009-09-21 4 views
1

objective-c에서 할당이 해제되지 않은 객체에 문제가 있습니다. 나는 이것이 어딘가에서 유지되고 있기 때문에 이것이 확실하다는 것을 알았지 만 어디에서 (0이되어야하는지 retainCount를 체크하는 것은) 1을 반환하는지 모른다. 나는 여러 차례 코드를 작성했지만 그 코드를 유지하지 못하는 것을 보지 못한다. 내가 사용하고있는 프레임 워크의 버그 일 수도 있습니다.objective-c 객체가 dealloc을 얻지 못한다 : ed

어떻게 이런 식으로 처리하겠습니까? 나는 아마도 당신이 기억을 탐색하여이 대상을 가리키는 것을 볼 수있을 것이라고 생각했는데, 그것이 왜 이런지를 쉽게 알아낼 수있게 만들었지 만 그것을 성취하는 방법을 잘 모르겠습니다. 어쩌면 다른 해결책일까요?

답변

5

Instruments을 사용해 보셨습니까?

+0

와우, 고마워. 나는 그 앱에 대해 완전히 잊어 버렸다. 그리고 이상하게도 악기를 사용하여 프로그램을 디버깅하고 오류를 보지 못하면 dealloc이 호출되기 시작했습니다. : s – quano

+0

O man 인스 트루먼 트가 멋지다면! 지금까지 사용하지 않았지만 매우 유용합니다. – quano

2

-retain 및 -release를 재정의 한 다음 누가 중단 점을 설정했는지 확인하십시오.

+0

어딘가에이 솔루션을 보았습니다. 매우 간단하고 좋은 솔루션처럼 보입니다. 하지만, 누가 누가 석방을하고 보유하고 있는지 어떻게 알 수 있습니까? 유일한 주장은 자기? – quano

+1

이것은 ** 누가 ** 전화하는 지 알아내는 데 도움이 될 수 있지만, ** 누가 아닌지 ** 알아내는 데 도움이 될 수 있습니다. ** 당신은 여전히 ​​스스로 알아 내야 만합니다. Xcode 정적 분석기는 훨씬 더 우아하고 고통없는 접근 방식이며, 대부분의 누출은 객체를 할당하고 객체를 다른 사람에게 넘겨주기 전에 적절하게 릴리스하지 않기 때문에 발생합니다. –

+1

"하지만 어떻게 내가 누가 석방을하고 유지하는지 누가 압니까? " -retain 및 -release에 중단 점을 설정하면 해당 중단 점에 도달 할 때 호출 스택을 검사하여 보유 및 릴리스를 호출 한 사용자를 표시 할 수 있습니다. – jarmod

8

Instruments 큰이며, 그들이 유출되지만, 이와 같은 경우에 제가 제안 할 때 먼저 스노우 레오파드 (Snow Leopard)와 엑스 코드 3.2의 새로운 기능 Xcode Static Analyzer을 사용하는 경우 및 유출 객체 에 선택할 수 있습니다. Leopard를 사용하는 경우 command-line version을 사용할 수 있습니다. 정적 분석을 사용하면 코드를 실행하지 않고도 많은 문제를 찾을 수 있으며 대부분의 경우 Instruments보다 훨씬 쉽게 사용할 수 있습니다.

+0

clang이 obj-C++에서 작동하지 않는다고 들었습니다. Xcode 정적 분석기가 그렇게합니까? 그렇다면 스노우 레오파드로의 업그레이드를 진지하게 고려하고 있습니다. – quano

+0

Xcode 정적 분석기 **는 더 나은 IDE 통합과 함께 ** Clang 정적 분석기이며, 둘 다 Clang을 프런트 엔드 파서로 사용합니다. Clang은 ** 아직 ** C++과 작동하지 않지만 진행은 꾸준히 이루어지고 있습니다. http://clang.llvm.org/cxx_status.html Clang 자체는 C++로 작성 되었기 때문에 저자가 언어를 지원하는 방법에 대해 얼마나 잘 알고 있는지 확신 할 수있을 것입니다. :-) –

+0

그러나 Objective-C 지원은 훌륭하고 하나의 도구만으로도 메모리 누수의 원인을 추적하는 수많은 시간을 절약 할 수 있다는 점에 유의해야합니다. –