2010-08-12 3 views
1

보기 컨트롤러가 있습니다. 뷰 컨트롤러에는 내 서버에서 모든 데이터 I/O를 처리하는 NSObject 하위 클래스 인 streamController라는 유지 된 객체가 있습니다. 모든 것이 잘됐다. 왜 내가 streamController에서 어떤 것들이 새어 나오는지 알아 내려고 노력하고있다. 나는 거기에 NSLog를 떨어 뜨 렸으며 결코 발사되는 것을 보지 못했다. 나는 왜 내 컨트롤러에 대한 내 dealloc 메서드에서 컨트롤러를 공개하기 때문에 완전히 당황 스럽다. 뷰 컨트롤러 인터페이스 내 클래스의 dealloc이 호출되지 않는 이유는 무엇입니까?

보기 제어기 구현에서

StreamController *streamController; 
@property (nonatomic, retain) StreamController *streamController; 

... StreamController 구현에서

@synthesize streamController; 

- (id)init { 
    [super init]; 
    self.streamController = [[StreamController alloc] init]; 
} 

- (void)dealloc { 
    NSLog(@"dealloc view controller"); 
    [streamController release]; 
    [super dealloc]; 
} 

...

- (void)dealloc { 
    NSLog(@"dealloc stream controller"); 
    [super dealloc]; 
} 

이 마지막 할당 해제 가져 결코 라는. 왜?

+0

설정 streamController입니다 도움

희망 (개체의 초기화 등) 전무는 것을 확신하는 경우

나는 B 아니면 C를 사용하는 것이 좋습니다 것인가? – jtbandes

+0

방금 ​​ –

+0

을 표시하도록 업데이트되었습니다. 사용 후 * streamController를 해제 하시겠습니까? * 걱정하지 마세요. 코드를 이미 업데이트했습니다. * – elslooo

답변

3

나는 당신이 당신의 속성이 속성을 유지할 경우 다음 다음 예를 살펴해야 메모리, 를 유출하는 생각 : 당신이 수를 유지 선택하면 당신은 접근 방식이 표시됩니다

//A 
self.streamController = [[StreamController alloc] init]; 

//B 
StreamController * st = [[StreamController alloc] init]; 
self.streamController = st; 
[st release]; 

//C 
streamController = [[StreamController alloc] init]; 

당신의 A의

개체가 이미 012을 가지고 [[StreamController alloc] init];를 수행하여 : B에는 이유 만 1

될 것입니다 동안 streamController 객체는 retainCount 2의 것을 1로 설정하여 속성에 전달하십시오. 그런 다음 유지로 선언 했으므로 유지됩니다. 따라서 retainCount은 2가됩니다.

B는 기본적으로 동일하지만 속성을 전달한 직후에 개체를 해제합니다. 따라서 retainCount가 1로 끝납니다. (이것이 우리가 원하는 것입니다.)

C에서는 속성을 사용하고 있지 않으므로 값을 직접 설정하고 있습니다. 따라서 그것은 한 번만 유지됩니다. 이 경우는 초기화이기 때문에 괜찮습니다. 당신이 streamController이이

+0

와우는 기록되지 않습니다. self.x = [[뭐든간에] init] 사이에 차이가 있다는 것을 나는 전혀 몰랐다. 그리고 x = [[어쨌든간에] init]; 그건 정말 어리석은 것처럼 보입니다. 감사! –

+0

예 :'foo.x = whatever'는 실제로'[self setX : whatever]'로 컴파일됩니다 (foo는 Objective-C 객체 임). – Wevah

관련 문제