2011-01-14 3 views
2

3 시간 정도 지나면 마침내보기 컨트롤러에서 메모리 누수 문제를 해결할 수있었습니다. 누수는 헤더 파일에 'retain'속성이 설정된 UIPickerView에 의해 발생합니다. Objective-C 메모리 관리 -이 모든 것을 잘못하고 있음을 확신합니다.

다음 코드

는 그것을 해결하기 위해 관리 :

- (void)viewDidLoad { 
    [super viewDidLoad];  
    myPicker = [[[UIPickerView alloc] initWithFrame:CGRectZero]autorelease]; 
} 

- (void)dealloc { 
    [super dealloc]; 
    [myPicker release]; 
    myPicker = nil; 
} 

내가 나쁜 알고 ...이 코드가 얼마나 충격적인 말하지 마십시오. 나는 릴리스, 을 가지고 있습니다. 문제는 내가 위의 일부를 변경하거나 제거하면 메모리 누수가 반환된다는 것입니다.

는 그래도 난 내가

왜 위의 코드는 메모리 누수를 해결 않습니다 ... C의 메모리 관리가 분명하지, 어떻게 작동하는지 목적을 알고, 무엇을 수도 같은 코드 모양의 올바른 버전?

-

편집 : 사람이 같은 문제가, 또는 관심이 있다면

- 문제가 내 수업 시간에 다른 개체 중 하나가 '유지'보다는로 설정된 것을 '지정 '. (객체를 소유하고 있지 않다면, retain이 아닌 assign 속성을 가져야합니다.)

캐논 데일 (Cannondale)과 마찬가지로 여분의 보유를 제거하면 모든 것이 수정되고 하나의 릴리스 만 필요합니다.

+0

당신이 듣고 좋았습니다. 좋은 한 :) – RedBlueThing

+0

이 도움이 될 수 있습니다 : http://interfacelab.com/objective-c-memory-management-for-lazy-people/ – hlfcoding

답변

4

코드의 다른 곳에서 myPicker를 보유해야합니다. myPicker 할당 행은 스택이 viewDidLoad 호출을 위해 언 롤링하자마자 (즉, autorelease가 호출하는 것임) 그 메모리를 해제합니다.

그 시점 이후에 보관해야합니다. 그렇지 않으면 [myPicker release]가 예측할 수없는 결과가있는 할당되지 않은 메모리를 해제하려고 시도하는 것입니다.

당신이해야 할 일은 viewDidLoad에 메모리를 할당하는 것입니다 (따라서 자동 해제를 제거하십시오). 다른 곳에서는 객체를 유지하지 말고 dealloc에서 myPicker를 해제하십시오. bbum가 할당 해제의 재 말한 또한

...)

+0

감사합니다 - 많은 의미가 있습니다! 많은 감사합니다 ^^ 이제 여분의 항목을 찾으려고합니다. –

+0

'myPicker'는 인터페이스 파일에서 만든 속성 중 하나입니까? 아마도 보유하고있는 속성일까요? 내 추측이야. –

4

포격 말했다 무엇. 그래야 작동합니다.

myPicker = [[UIPickerView alloc] initWithFrame:CGRectZero]; 

dealloc도 파기됩니다. super으로 전화하면 언제나 마지막으로 생각해야하며 (생각하면) 정의되지 않은 동작이 발생할 수 있습니다.

- (void)dealloc { 
    [myPicker release]; 
    myPicker = nil; 
    [super dealloc]; 
} 
+0

아직도 정말 우아합니다. 나는 그것이 나를 위해 ObjC를 배울 때라고 생각한다. –

+0

여기서 myPicker를 nil로 설정하지 마십시오. 실수로 참조 해제 할 위험이 없도록 마지막으로 참조 할 수 있습니다. – JeremyP

+0

사실 충분합니다. 나는'[foo release], foo = nil;'과 같이 습관적으로 그것을 끝내게된다.때때로 디버깅이 쉬워집니다 (그리고 dealloc 외부에서 해제해야한다면 클릭 복사/붙여 넣기를 세 번 할 수 있습니다). – bbum