2011-04-27 3 views
1

클래스 A의 헤더에 인터페이스가 아닌 인터페이스에 NSDictionary *data;이 있습니다.함수 사이에 메모리 문제가 있습니다.

하나의 메서드에서 나는 NSDictionary을 반환하는 다른 클래스 B의 다른 메서드를 호출하고, data = [class method]을 만들고 모두 잘합니다.

나중에 data이 채워지면 data에 액세스하려고 시도하고 앱이 충돌합니다.

나는 이전 방법에 data에 보관 한 경우 :

data = [class method]; 
[data retain]; 

그것은 모든 일을하지만 지금은 메모리 누수가. 왜 추락합니까?

답변

4

참조하기 전에 반환 된 사전이 할당 취소되기 때문에 첫 번째 경우에 오류가 발생합니다. 해당 -release이없는 -retain이 있기 때문에 두 번째 경우에 메모리 누수가 발생합니다.

개체를 반환하는 대부분의 메서드는 autorelease 개체를 반환합니다. 이렇게하면 현재 실행 루프가 끝날 때까지 객체가 유지되지만 그 시점에 객체가 해제됩니다 (즉, autorelease의 기능).

data = [[class method] retain]; 

을하지만 당신은 객체를 유지 한 후, 그것을 해제하는 것은 귀하의 책임입니다 : 현재 실행 루프를 넘어 살아있는 개체를 유지하려는 경우, 당신은 그것을 유지해야합니다. 객체의 인스턴스 변수의 경우,이 작업을 수행 할 수있는 권리 시간 -dealloc에 보통 : 이제

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

, 당신은 또한 다른 값으로 data을 덮어 쓸 경우, 당신은 또한 확실히 그 이전 값을해야 알고 있어야합니다 제대로 풀려나. 이것은 속성을 사용하는 장점 중 하나입니다. 컴파일러가이 일을 처리하는 함수를 작성할 수 있습니다. 당신의 재산은

self.data = newvalue; 

것) release 이전 값, b)는 retain 새 값으로 값을 설정보다 retain 재산이며, c)는 새 값으로 인스턴스 변수를 설정합니다. 그래도 개체가 파괴되면 dealloc에서 값을 공개해야합니다.

+2

'[super dealloc];을 잊지 마세요. 정치적으로 정확합니다. :) –

+0

사실, [super dealloc]은 항상 좋은 생각입니다. –

0

왜 메모리 누수가 발생합니까? 귀하의 질문을 이해하면 dealloc 클래스 A 메서드에서 [data release];을 수행하면됩니다.

관련 문제