2011-07-28 7 views
1

저는 왜 이것이 유출되고 있는지 알아 내려고 제 머리를 꺼내 왔습니다. 내 .h 파일에서 NSMutableArray 유지 nonatomic 합성 된 속성이 있습니다. 내 애플리케이션 전체NSMutableArray에 누수가 있습니다.

self.tableData = [[NSMutableArray alloc] init]; 
[self.tableData removeAllObjects]; 
fillData(self.tableData); 

, I는 [self.tableData removeAllObjects] 호출하고 fillData (self.tableData) 함수를 다시 채울 내에서의 viewDidLoad는 I로 선언. 내가 내 할당 해제의 방법에서

void fillData(NSMutableArray* list) 
{ 
    for (set<string>::const_iterator itr = sortedData.begin(); itr != sortedData.end(); ++itr){ 
     [list addObject:[NSString stringWithFormat:@"%s", ((string)*itr).c_str()]]; 
    } 
} 

:

[self.tableData removeAllObjects], [self.tableData release], tableData = nil; 

는 어디에서 볼을 드롭 않은이 함수는 정적 C++ 문자열 세트에서 데이터를 채워? Instruments는 [list addObject ....] 행에 있다고 말합니다.

감사

+0

'((string) * itr) .c_str()'호출이 자동 릴리즈되지 않은 문자열을 반환합니까? –

+0

네,하지만 자동으로 해제되어야하는 NSString으로 복사됩니다. 그래서 이것이 어떻게 누출을 일으키는 지 잘 모르겠습니다. NSString 대신에 alloc/autorelease를해야합니까? – Alede

+0

괜찮아요. 만약 당신이 줄을 두 개로 나눠서'const char * s = (* itr) .c_str(); [목록 addObject : [NSString stringWithUTF8String : s];'? – Yuji

답변

4
self.tableData = [[NSMutableArray alloc] init]; 
[self.tableData removeAllObjects]; 
fillData(self.tableData); 

+1 +1은이 호텔의 세터를 사용하는 유지, alloc에 대한 유지. +1에서 alloc의 균형을 조정하지 않았습니다. 점에서 removeAllObjects이 완전히 무의미 것을

self.tableData = [NSMutableArray array]; 
fillData(self.tableData); 

참고 : 당신은 세터를 사용하려는 경우.

이 너무 이상하다 :

[self.tableData removeAllObjects], [self.tableData release], tableData = nil; 

먼저, 개체를 제거 귀찮게하지 않습니다. 배열이 할당 해제되면 모든 객체가 해제됩니다. 둘째, 설정자를 사용하여 release에 전화를 걸면 즉시 직접 할당을 수행하는 것이 일관되지 않습니다. 중 하나를 수행합니다

self.tableData = nil; 

또는 :

[tableData release], tableData = nil; 

(이 모두의 ,의 사용은 당신의 이익을 위해 순전히도 있습니다 - 그것은 생성 된 코드에 영향을주지 않습니다.)

또한 stringWithFormat:이 아니라 stringWithUTF8String:을 사용하십시오.

self.tableData = [[NSMutableArray alloc] init]; 

당신은 tableData이 유지이야 속성이라고 말할 : 그것은 누출 하지만 그것이 문제처럼이 보이는 경우

+0

당신, 각하, 감사합니다. – Alede

+0

+1, 아주 좋은 설명. – InsertWittyName

0

확실하지. 시도해보십시오 :

self.tableData = [NSMutableArray arrayWithCapacity:10]; 

그런 식으로 속성을 유지하면 배열 자체가 자동으로 변환됩니다. dealloc에 출시하면 보유 수를 0으로 되돌립니다.

+1

'arrayWithCapacity :'로 귀찮게하지 마라. * 정확하게 그리고 언제나 * 얼마나 많은 아이템이 있을지 모른다면. 그럼에도 불구하고, 그것은 대부분 코드에서 혼란스러워서 수입에 대한 실질적인 이점을 제공하지 못합니다. – bbum

0

문제는 속성이 retain으로 설정되어 있고 이미 유지 된 개체로 설정 한 것입니다. 당신은 이런 식으로 그것을 수행해야합니다

// viewDidLoad 
NSMutableArray *array = [[NSMutableArray alloc] init]; 
self.tableData = array; 
[array release]; // this is important 

// dealloc 
self.tableData = nil; // will automatically release the array 
0

당신의 dealloc에서 다시 tableData을 유지 속성을 사용합니다.그게 당신이 그렇게 원하는 정말로되지 않습니다 :

[tableData release]; 

또는

[self->tableData release]; // not necessary, but some prefer it. 

또는

self.tableData = nil; // property will handle release 

tableData, 전무에 아무것도 설정할 필요가 없습니다 (당신을 취소 할 필요가 없습니다 할당 해제되므로 아무 것도 더 이상 액세스하지 않습니다.)

관련 문제