2009-07-11 5 views
2

아직 Objective-C/iPhone SDK를 배우고 있습니다. 나는 이것이 왜 작동하지 않는지 알 것 같지만, 나는 단지 확인하고 싶었다. awakeFromNib에서[[NSMutableDictionary alloc] initWithObjects : ...]와 [NSMutableDictionary dictionaryWithObjects : ...]의 차이점은 무엇입니까?

,이 NSMutableDictionary 데이터 [[NSMutableDictionary alloc] initWithObjects:...] 실제로 할당 (아이폰) 시스템 메모리를 사용하지만 [NSMutableDictionary dictionaryWithObjects:...]를 사용할 때 스택의 오른쪽에만 사용할 수 있는지?

예를 들어, 나중에 IBAction을 통해 버튼 누르기에서 myMutableDict에 액세스하려고 시도하면 myMutableDict 개체가 해제되어 내 .h 파일에서와 같이 정의한 경우에도 내 앱이 중단 될 수 있습니다. 이 고정 [[NSMutableDictionary alloc] initWithObjects:...]로 변경 어떤 이유로

@property (nonatomic, retain) NSMutableDictionary *myMutableDict; 

:하고이를 합성.

답변

15

+dictionaryWithObjects: 당신이 사전은 인스턴스 변수로 유지하려면
-initWithObjects: 당신이, 당신이 초기화 방법을 만들거나 오토 릴리즈 버전을 유지해야한다, 자신에게 당신이해야 어느 쪽이든

을 해제되어야하는 오토 릴리즈 사전을 반환 dealloc 메소드에서 해제하십시오.

이 주제에 대한 유용한 자료는 Memory Management Programming Guide for Cocoa입니다.

+1

그래서 기본적으로 프로젝트 전체에서 어떤 목적 으로든 오브젝트를 합성하면 언제든지 initWithDictionary를 사용하여 무작위로 출시되지 않도록 할 수 있습니까? – taber

+0

올바른지 또는 [[NSMutableDictionary dictionaryWithObjects ...] retain]이 동일 함 – cobbal

+0

괜찮음, 감사합니다. – taber

3

다른 답변을 펼치려면 누락 된 몇 가지 미묘한 점이 있습니다.

Objective-C에는 스택 개체와 같은 것이 없습니다. 모든 객체는 힙에 저장되며, 하나의 형식은 "autoreleased"입니다.

또한 @synthesize '접근 자 및 변형 자의 메모리 관리를 우회하여 인스턴스 변수를 직접 설정하고 있습니다. 대신이의 :

myMutableDict = [NSMutableDictionary dictionaryWithObjects:...]; 

당신은 아마

self.myMutableDict = [NSMutableDictionary dictionaryWithObjects:...]; 

말을해야한다 그렇지 않으면 당신은 수동으로 발견 한로는, 오토 릴리즈를 유지하거나 제거 추가해야합니다.

다시 메모리 관리 안내서를 읽으십시오. 이 모든 것을 철저히 설명합니다.

+0

, 고마워요! – taber

+0

나는 그것을 확실히하고 있었다. 죄송합니다. 다시 한 번 감사드립니다. – taber