1

저는 Apple의 메모리 관리 설명서를 읽었으며 응용 프로그램에서 적절한 메모리 관리를 보장하기 위해 따라야하는 실무를 이해하고 있다고 생각합니다.objective-c에서 메모리 누수를 잡아내는 디자인 패턴?

현재 코드에 메모리 누수가없는 것 같습니다. 그러나 코드가 복잡 해짐에 따라 객체의 할당과 할당 해제를 추적해야하는 특정 패턴이 있는지 궁금합니다.

유형의 활성 객체 수를 포함하는 응용 프로그램 실행을 통해 나타나는 일종의 전역 객체를 만드는 것이 합리적입니까? 각 객체는 init 메소드에서 유형의 카운트를 증가시키고 dealloc에서 감소시킵니다. 전역 개체는 특정 유형의 수가 0이 아닌지 적절한 시간에 확인할 수 있습니다.

편집 : Xcode를 사용하여 프로젝트를 분석하는 방법뿐만 아니라 누수를 사용하는 방법을 알고 있습니다. 이 게시물의 이유는 누출 또는 쉽게 분석 할 수없는 사례를 추적하는 것입니다.

EDIT : 또한 전역 개체를 검사하는 단위 테스트를 실행하여 빌드에서 누수를 조기에 감지 할 수 있도록하는 것이 좋습니다. 경험이없는 객관적인 프로그래머로서 나는 이것에 관해 다른 사람들의 견해로부터 이익을 얻을 것이라고 생각한다.

+0

'[anObject retainCount]'를 사용하여 객체의 보유 수를 찾을 수 있으므로 시스템이 필요하지 않습니다. – gurooj

+0

@gurooj [-retainCount'에 대한 설명] (http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/) occ/intfm/NSObject/retainCount) 자체에 설명되어 있지만 메모리 관리 디버깅에는이 메서드를 사용하지 말아야합니다. – Caleb

답변

1

경로를 지키지 마십시오 ... 단일 상속의 고통입니다. 무엇보다 중요한 도구는 글로벌 카운터를 만들어야한다고 생각하기 전에 마스터해야 할 훌륭한 도구입니다. 글로벌 카운터는 이미 몇 가지 도구에 있습니다 - 자세히 알아보십시오!

당신이 싸우는 방법은 쓰여졌을 때 모든 것을 올바르게 균형 잡고 관리하는 법을 배우는 것입니다. 그것은 매우 간단하게 보았습니다.

ARC는 다른 옵션입니다. 실제로는 단지 사용자의 이해를 지연시킵니다.

첫 번째 "디자인 패턴"가능하면 autorelease 대신 release을 사용하는 것이 좋습니다 (일반적으로 과다 출시에 더 유용하지만).

다음으로 누출 기기/유틸리티를 정기적으로 실행하고 모든 누출/좀비를 즉시 수정하십시오.

셋째, 기존 도구를 배우십시오! 이러한 도구는 모든 할당 및 모든 참조 카운트의 백 트레이스를 기록하는 것과 같이 실제로 미친 작업을 수행 할 수 있습니다. 프로그램의 실행을 일시 중지하고 할당이 존재하는지, 할당 수, 백 트랙 및 기타 모든 통계를 볼 수 있습니다.

+0

글로벌 카운터 및 다른 도구에 대해 더 자세히 이야기 해 주시겠습니까? (이름 등?) 고마워. – xcoder

+0

Instruments.app-> 할당 및'heap'은 내가 가장 많이 사용하는 카운터입니다. – justin

2

각 개체는 메서드에서 해당 유형의 카운트를 증가시키고 dealloc에서 감소시킬 수 있습니다. 같은 NSObject의의 -init하거나, 또는 2) 모든의 지정된 초기화에 적절한 코드를 추가로 몇 가지 일반적인 점에서 1) 재정의 동작 :

가 그 권리를 수행하려면 다음 중 하나를 수행해야합니다 단일 클래스. 어느 쪽도 간단하게 보입니다.

글로벌 개체는 특정 유형의 수가 0이 아닌지 적절한 시간에 확인할 수 있습니다.

"좋은 시간"에 대해 조금 자세히 설명해 주시겠습니까?어떻게하면 수업에 제로 인스턴스가 있어야하는 당신의 프로그램의 삶의 어떤 시점에서 알았겠습니까? 프로그램이 끝나면 아무 것도 없어야한다는 좋은 생각이 들겠지 만 인스 트루먼 트는 그 경우 똑같은 것을 말할 수 있습니다.

Objective-C는 메모리 관리를 훨씬 단순하게 만들기 위해 여러 단계를 거쳤습니다. 개체를 본질적으로 관리하기 때문에 가능한 한 속성과 합성 된 접근자를 사용하십시오. 가장 최근의 개선 사항은 대부분의 메모리 관리 작업을 자동화하는 ARC입니다. 기본적으로 컴파일러는 메모리 관리 호출을 어디에 두어야 할지를 파악합니다. 가비지 수집기가없는 가비지 수집과 같습니다. 새로운 도구를 만들려고하기 전에 이러한 도구를 사용하는 법을 배우십시오.

+0

현재 나의 현재 프로젝트는 각 레벨에 관련된 모든 오브젝트가 들어있는 iPhone 게임입니다. 따라서 한 수준이 완료되면 모든 개체가 할당 취소되어야하며 이는 카운터를 확인할 적절한시기입니다. 나는 이미 합성 속성과 접근자를 사용했습니다. 현재 수정할 수없는 타사 라이브러리를 사용하기 때문에 프로젝트를 ARC로 마이그레이션 할 수 없습니다. – xcoder

+0

필요한 경우 개별 파일에 대해 ARC를 비활성화 할 수 있습니다. – Caleb

관련 문제