NSMutabledictionary 인스턴스 변수를 Objective-C에서 중첩 사전으로 올바르게 해제하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1402778

문제

다음과 같은 것처럼 보이는 객관적인 C 클래스가 있습니다.

@interface myClass : NSObject
{
    NSMutableDictionary *aDict;
}

세터 방법은 다음과 같습니다.

- (void) setADict: (NSMutableDictionary *) newDict
{
    [aDict release];
    [newDict retain];
    aDict = newDict;
}

나는 객체의 인스턴스를 만들고 데이터를 adrive에 넣었으며 이제 객체를 제거하고 프로세스에서 메모리를 정리하고 싶습니다. 두 가지 질문 :

1) 릴리스해야합니다 adit 안에 내 수업'에스 거래 그림과 같이 방법?

[aDict release];

=============================================================================

2) 나는 여러 어린이 사전을 중첩했습니다 adit, 키아 그리고 키브, 그렇게 :

// aDict:
{
    keyA =     {
        keyA1 = "Hello world";
        keyA2 = 1234;
    };
    keyB =     {
        keyB1 = Earth;
        keyB2 = 25000;
    };
}

윌 a Adict Release 메시지 "체인을 전파"하고 Adict 내부의 모든 어린이 사전을 청소합니다. 그들의 키/가치 객체? 아니면 그들을 제거하기 위해 다른 일을해야합니까?

도움이 되었습니까?

해결책

예.

컬렉션 개체는 수집하는 것들을 유지하므로 컬렉션이 처리되면 릴리스의 균형을 유지합니다.

그런 다음 보유하고있는 사전 중 하나가 처리 된 경우, 사전은 컬렉션이기 때문에 키/값 쌍도 출시 될 것입니다.

배열과 세트에 대해서도 마찬가지입니다.

그러나 코드에 버그가 있습니다. 당신은 :

- (void) setADict: (NSMutableDictionary *) newDict
{
    [aDict release];
    [newDict retain];
    aDict = newDict;
}

언제 사건을 고려하십시오 newDict 같은 대상입니다 aDict. 그런 다음 사전을 해제하고 거래로 처리 된 다음 유지하려고 시도하지만 whops! 더 이상 거기에 없습니다.

이 문제를 해결하기위한 세 가지 대안이 있습니다. 여기 있습니다:

    - (void) setADict: (NSMutableDictionary *) newDict
    {
        [aDict autorelease];
        [newDict retain];
        aDict = newDict;
    }

    - (void) setADict: (NSMutableDictionary *) newDict
    {
      if (aDict != newDict) {
        [aDict release];
        [newDict retain];
        aDict = newDict;
      }
    }

    - (void) setADict: (NSMutableDictionary *) newDict
    {
        [newDict retain];
        [aDict release];
        aDict = newDict;
    }

세 번째는 가장 단순하고 두 번째는 시간이 지남에 따라 가장 빠르며 첫 번째는 . 첫 번째는 자동 제출 풀을 혼란스럽게합니다 (메모리 부풀어 오르지 않을 수도 있음). 두 번째와 세 번째는 안전 및 속성 메모리 관리 측면에서 동일합니다. 그러나 두 번째는 동일한 사전을 그 자체로 설정하는 경우 불필요한 방법 호출을 절약 할 수 있습니다.

다른 팁

NSMutableDictionary 릴리스시 모든 객체 (값)를 해제합니다.

NSMutableDictionary 키를 복사하고 추가 한 각 키/값 쌍에 대해 값으로 유지합니다. 코코아 연습은 무언가가 참조를 유지하면 그것을 공개 할 책임이 있다는 것입니다.

NSMutabledictionary 참조를 참조하십시오

초기화의 일부 (모든 사전) 또는 수정 중 (돌연변이 가능한 사전의 경우)에 대한 사전에 항목을 추가하는 메소드 각 주요 인수 (키는 NSCopying 프로토콜을 준수해야 함)와 사전에 사본을 추가합니다. 각각의 해당 값 객체는 사전이 진행되기 전에 거래되지 않도록 보유 메시지를 수신합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top