2009-08-26 3 views
2

전화 번호부 iPhone 응용 프로그램에서 코드를 정리하고 Instrument의 누수 도구가 NSCFString 객체를 누출한다고보고합니다. 나는있는 NSString 회원과 이름에 대한 관련 속성 지역에 불과, 성이없는 내 응용 프로그램에서 Person 클래스가목표 C NSMutableArrays로 NSCFString 누수

내 뷰 컨트롤러가 있습니다 여기에 내가 다음 오전 패턴은 searchBarSearchButtonClicked 이벤트의 SQLite 데이터베이스에서 채워지는 NSMutableArray 속성입니다. 이 NSMutableArray는 내 tableview 컨트롤을 채우는 데 사용될 Person 객체로 채워집니다. 또한 사용자가보기에서 사람을 클릭하면 해당 Person 객체가 Detail보기로 전달되어 이름 이외의 추가 정보를 볼 수 있습니다.

첫 번째 조회를 수행하고 결과를 표시 할 때 메모리 누수가 없습니다.

이제 두 번째 룩업을 수행 할 때 NSMutableArray를 지우고 새 결과 집합을 메모리 누수없이 다시로드하는 것이 이상적입니다.

[self.personList removeAllObjects]; 
self.personList = [SearchService GetPersonList:searchText]; 
[list reloadData]; 

내가 가지고하는 데 사용되는 누수를 제거 왔 removeAllObject를 호출하여 아래 그림과 같이 그럼,이 일을, 나는 나의 personList 재산 removeAllObjects를 호출 한 후 personList있는 NSMutableArray를 다시 채울 수있는 데이터베이스를 호출 Person 오브젝트와 연관되어있다. 그러나, 이제는 개별 Person 객체의 속성에서 남겨진 NSString 객체가 누출되고 있습니다.

이것이 가능합니까?

저는 Instruments 도구에 익숙하지 않지만 NCSFString 누수 중 하나를 드릴 할 때 확장 정보에서 알 수있는 것부터는 스택의 마지막 코드 줄이 종종 @synthesize 코드 줄을 가리키고 있습니다.

@synthesize firstName; 

따라서 NSString이 정리되지 않는 이유는 다음과 같습니다. 메모리 누수가 발생하지 않는 더 좋은 방법이 있습니까?

+0

Person 클래스의 코드를 게시 할 수 있다면 상황을 쉽게 진단 할 수 있습니다. – Mark

답변

3

Person 클래스의 dealloc 메서드에서 NSString을 릴리스합니까?

당신이 그렇게 귀하의 속성을 설정하는 것이 가정 :

@property (retain) NSString *firstName; 

당신이 세터를 사용하여 firstName을 설정하면,이 유지됩니다. Person 인스턴스가 해제 및 할당 해제되었지만 firstName이 릴리스되지 않은 경우 누출됩니다.

당신의 Person 클래스의 dealloc 방법에 넣어 :

- (void)dealloc 
{ 
    [firstName release]; 
    [super dealloc]; 
} 

(당신의 firstName 속성에 사용되는 해당 바르 가정은 firstName라고합니다).

+0

이것이 효과가있는 것으로 보입니다. 그러나 XCode 3.2.1의 코드 분석기는 dealloc 메서드의 내 릴리스에 대해 다음과 같이 설명합니다. "호출자가이 시점에서 개체의 참조 횟수를 잘못 계산하지 않았습니다." 아이디어? – rtemp

+0

코드 분석기는'-dealloc'에서 accessor 메소드를 사용하여 버그를 고 려하고 이것을 경고합니다 -'init'와'dealloc'에서 접근자를 사용하는 것이 타당한 지에 대한 논쟁이 있습니다 만, 나는 일반적인 합의가 조종하는 것이라고 생각합니다 명확하고 ivars에 직접 액세스 (죄송합니다 그 전에 지적해야합니다). –

+0

내 속성 설정은 다음과 같지만이 기능은 유용했습니다. @property (nonatomic, assign) NSString * name; –