0

누출, I는 다음과 같이 viewDidAppear에있는 NSDictionary를 정의가 NSMutableDIctionary 일으키는 메모리에있는 NSData의 변경 가능한 복사 코드 내에서

데이터 사전 = [NSMutableDictionary ALLOC] INIT];

는 나중에 loadData 방법에서,이 같이있는 NSDictionary의 변경 가능한 사본을로드 : 나는 다른보기로 전환 할 때

나중에
 [dataDictionary setObject:[receivedData mutableCopy] forKey:[theConnection description]]; 

는, 내가 내 데이터 사전을 언로드 메모리를 절약하십시오. viewDidDissAppear에서 나는 다음을 넣었습니다.

[dataDictionary release]; dataDictionary = nil;

그리고 dealloc에서도 dataDictionary를 릴리스합니다.

그러나 mutableCopy와 관련된 메모리 누수가있는 것처럼 보입니다. 그리고 이것은 내가 작성한 유일한 mutableCopy이므로 위에 표시된 mutableCopy에 있어야합니다. 누군가가 이것이 새는 이유를 알 수 있습니까? 나는 mutableCopy가 NSMutableDictionary를위한 할당 외에도 또 다른 할당을한다고 생각하지만 mutableCopy가 사전 내에 있고 사전이 해제 된 이후로 어떻게 대처해야할지 모르겠습니다. 당신은 하나의 유지 수를 사용하여 NSMutableData를 수신하고 있으므로 사전에

감사합니다 ...

+0

이, 당신이 필요로 잘 보이는'[receivedData 자료]'더 이상'receivedData'를 사용하는 경우, 그렇지 않으면에 atleast release dealloc에서 receivedData받은 –

+0

그래, 사전에 사본으로 추가 한 후에 receivedData를 릴리스했습니다 ... – Jackson

답변

1

는 다음의 mutableCopy 방법은 오토 릴리즈 객체를 반환하지 않습니다이

[dataDictionary setObject:[[receivedData mutableCopy] autorelease] forKey:[theConnection description]]; 
+0

충돌이 발생하여 "malloc : *** error for object 0x5e3cbd0 : double free"오류가 발생합니다. 나중에 dataDictionary에서 개체 중 하나를 제거하려고합니다. – Jackson

4

같은 시도 당신은 또한 그것을 보유하고있는 사전에 그것을 추가합니다. 그것은 사전에서 그것을 제거 할 때 파괴되지 않을 것이거나 사전이 할당 해제 될 때 당신이 그것에 대한 어떤 참조도 잃을 것이고 객체가 유출 될 것이라는 것을 의미합니다.

다른 누군가가 제안한 것처럼, dataDictionary에 추가 할 때 변경 가능한 사본을 자동으로 가져 오십시오.

[dataDictionary setObject:[[receivedData mutableCopy] autorelease] forKey:[theConnection description]]; 

또는 할

이미 당신이 당신의 mutableCopy에 오토 릴리즈 호출해야 언급 Benj와 Zaky처럼
NSMutableData *mutableData = [receivedData mutableCopy]; 
[dataDictionary setObject:mutableData forKey:[theConnection description]]; 
[mutableData release]; 
+0

두 번째 옵션을 시도했지만 여전히 누수가 발생합니다. 더 조심스럽게 살펴본 후 누설은 특별히 NSMutableData가 아니라 NSConcreteMutableData입니다. 그것이 콘크리트라고 말하면서이 누설을 이해하는 데 도움이 될만한 것이 무엇입니까? – Jackson

0

같은,하지만 당신은 모두의 dealloc 및 viewDidDisappear에 데이터 사전을 해제하지 않도록주의해야합니다 : . 당신이 그것을 만들 때 dataDictionary는 1의 보유 카운트를 가지며 viewDidDisappear : dealloc은 뷰가 소멸 될 때 호출 될 가능성이 높기 때문에 이미 해제 된 객체를 해제하려고 시도 할 것입니다.

dealloc에서만 dataDictionary를 릴리스했는지 확인하고 언급 한 "double free"오류 메시지가 표시되지 않습니다. viewDidDisappear의 ivar에서 "release"호출은 viewDidDisappear : 뷰의 수명주기 동안 여러 번 호출되기 때문에 (예 : 다른보기 컨트롤러가 탐색 스택에 푸시되는 경우) 위험한 제안입니다. 메모리를 절약하려면 viewDidLoad에 물건을 만들고 viewDidUnload에서 물건을 해제하는 것이 가장 좋습니다. viewDidUnload는 메모리 부족 상황에서 호출되므로이 상황에서 정확히 원하는 것입니다.

당신은 코코아 참조 카운팅 규칙에 대한 자세한 설명은이 게시물을 체크 아웃 할 수 있습니다 : Object ownership in stringWithString and initWithString in NSString

관련 문제