NSMutabledictionary 인스턴스 변수를 Objective-C에서 중첩 사전으로 올바르게 해제하는 방법은 무엇입니까?
-
05-07-2019 - |
문제
다음과 같은 것처럼 보이는 객관적인 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 프로토콜을 준수해야 함)와 사전에 사본을 추가합니다. 각각의 해당 값 객체는 사전이 진행되기 전에 거래되지 않도록 보유 메시지를 수신합니다.