2011-07-17 2 views
0

잠시 전에 답변을 찾았습니다. 문제를 해결하기 위해 정신적으로주의를 기울였습니다. 그러나 이제는 저의 삶에 대해 다시 찾아 볼 수 없습니다.NSDictionary로 메모리 관리

매우 간단합니다 - 현재 배열에 사전을 추가하는 방법이 새습니다. 제발, 그들이 제대로 풀려나는 것을 보장하는 가장 좋은 방법은 무엇입니까? 내 방법 :

[beachPresenters addObject:[[NSMutableDictionary alloc]initWithObjectsAndKeys: 
           @"Kayak rides",@"name",@"kayak_sm.png",@"smPhoto",@"kayak_med",@"medPhoto",@"Free kayak rides for kids",@"description",@"",@"Friday", 
           @"All day! 10.00am - 6.00pm",@"Saturday",@"",@"Sun",@"Beach",@"stage",@"Blah blah blah",@"blurb",nil]]; 
+1

에서 [메모리 관리 규칙]의 확실한 이해 (http://tinyurl.com/42kbr33) 당신을 도움이 것 너 자신에게 대답 해. 기본적으로, 당신은 그것을 공개하지 않고 무언가를 할당하고 있습니다. – Caleb

+0

Caleb에게 감사드립니다. 그렇습니다. 메모리 관리 문제에 대한 확실한 이해가 있으면 자신의 질문에 대답 할 수있을 것입니다. 이것은 내 아내가 왜 내가 나 자신에게 말하고 있는지 궁금해 할지도 모른다. 그러나 그것은 또 다른 문제이다. –

+0

도움을 주신 모든 분들께 감사드립니다. –

답변

1

beachPresenters (나는 그것이 배열의 가정) 사전의 소유권을, 그래서 사전 +alloc/-init에 의한 참조 카운트에 +1이 균형을하지 않습니다. 따라서 사전이 유출됩니다.

NSDictionary *presenter = [NSDictionary dictionaryWithObjectsAndKeys: ...]; 
[beachPresenters addObject: presenter]; 
1

귀하의 배열 beachPresenters 사용자가 만든 가변 배열을 유지하지만 당신의 예제에서 만든대로 배열은 이미 하나의 유지 수를 가지고

이 (가) 유지 균형을 동등의 편리한 메소드를 사용합니다. 따라서 귀하가 beachPresenters를 처분하더라도 귀하의 사전은 계속 유출됩니다 (즉, 누설 됨).

대신 [NSMutableDictionary dictionaryWithObjectsAndKeys :]를 사용하십시오.

0

당신이 가질 수있는 구현 아래와 같이 :

NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithObjectsAndKeys: 
          @"Kayak rides",@"name",@"kayak_sm.png",@"smPhoto",@"kayak_med",@"medPhoto",@"Free kayak rides for kids",@"description",@"",@"Friday", 
          @"All day! 10.00am - 6.00pm",@"Saturday",@"",@"Sun",@"Beach",@"stage",@"Blah blah blah",@"blurb",nil]; 

[beachPresenters addObject:dict]; 
[dict release]; 

또는

NSMutableDictionary *dict = [[[NSMutableDictionary alloc]initWithObjectsAndKeys: 
          @"Kayak rides",@"name",@"kayak_sm.png",@"smPhoto",@"kayak_med",@"medPhoto",@"Free kayak rides for kids",@"description",@"",@"Friday", 
          @"All day! 10.00am - 6.00pm",@"Saturday",@"",@"Sun",@"Beach",@"stage",@"Blah blah blah",@"blurb",nil] autorelease];