2010-06-29 5 views
2

키의 첫 번째 문자가 객체 이름의 NSMutableDictionary입니다. 보기는 아이폰에 '연락처'탭과 같은 것입니다. 또한 사용자는 목록에서 개별 개체를 선택할 수 있습니다.[NSMutableDictionary ValueForKey :]에서 반환 된 배열을 해제해야합니까?

코드에서 나는 각 선택된 객체가 그들을 더 처리하도록 찾습니다.

NSMutableArray *objectsToAdd = [[NSMutableArray alloc] init]; 
NSMutableArray *array  = nil; 

for (NSString *key in self.nameIndex) { 

    array = (NSMutableArray *)[searchedNameDictionary valueForKey:key];  
    for (Objects *eachObject in array) { 
     if (eachObject.objectIsSelected){ 
      [objectsToAdd addObject:eachObject]; 
     } 
    }   
} 
[array release]; 

-(void)dealloc() 
{ 
    [searchedNameDictionary release]; 
} 

해제 된 개체가 참조되는 메시지와 함께 searchedNameDictionary를 릴리스하는 곳에서 응용 프로그램이 충돌합니다.

위의 코드에서 [배열 릴리스]를 제거하면 앱이 정상적으로 작동합니다.

내 질문에 '배열'이 실제로 searchedNameDictionary의 객체를 릴리스하고 있습니다. 이것이 일어나고있는 것 같습니다.

배열을 해제하지 않으면 메모리 누수가 발생합니까?

답변

5

alloc 또는 copy 메서드에서 오는 경우가 아니면 release은 반환하지 말아야합니다.

반송 된 물체는 autoreleased입니다. 그렇지 않으면 수신 할 직후에 retain 주위에두기를 원할 경우.

+0

감사합니다. 메모리 관리의 기본 원칙을 적용해야합니다. 이제 코드에 대해 더 자신감을 가지십시오. 내 질문에 답해 주셔서 다시 한번 감사드립니다. – prd

2

array = (NSMutableArray *) [searchedNameDictionary valueForKey : key];

이렇게하면 자동 렌더링 된 객체가 반환되므로 객체를 해제 할 필요가 없습니다.

코드에는 문제가 있지만 대부분 스타일이 있습니다. [배열 릴리스]를 없애면 그 문제에 관한 한 잘 할 수 있습니다.

+0

예, [배열 릴리스]를 제거하면 자동 복구 된 객체를 릴리스하고있는 것처럼 문제가 해결됩니다. 사과 설명서에서 메서드가 자동 렌더링 된 개체를 반환하는 경우와 그렇지 않은 경우를 찾는 데 어려움을 겪고 있습니다. 메소드가 반환 할 객체의 유형 (자동 렌더링 여부)을 알 수있는 방법이 있습니까? – prd

+0

그래, 그냥 기본 규칙을 따르십시오. http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html "개체의 소유권은 이름이" (예 : alloc, newObject 또는 mutableCopy)를 포함하거나 보유 메시지를 보내는 경우 릴리스 또는 자동 릴리스를 사용하여 소유하고있는 객체의 소유권을 양도해야합니다. 당신이 물건을 받으면, 그것을 풀어서는 안됩니다. " 이것은 모든 것을 의미합니다. –

관련 문제