2011-01-21 5 views
1

두 개의 IBOutlet이있는 탐색 컨트롤러 스택의 일부로보기 컨트롤러가 있습니다. viewDidUnload에서 나는 무료로 :dealloc에서 IBOutlet을 릴리스해야합니까?

- (void)viewDidUnload 
{ 
    self.myView1 = nil; 
    self.myView2 = nil; 
    [super viewDidUnload]; 
} 

하지만 여전히 누수가있었습니다. 그래서 나는 그들에 대한 dealloc에 ​​릴리즈 메시지를 붙였습니다.

- (void)dealloc 
{ 
    [myView1 release]; 
    [myView2 release]; 

    [super dealloc]; 
} 

이것은 메모리 누수를 제거하는 것으로 보입니다. 그러나, 나는 항상해야한다고 들었습니다. 은 ivars가 alloc, copy 또는 new를 사용하여 만들어 졌다고 발표했습니다. 그래서이 두 릴리스가 여기에있는 것이 걱정됩니다. 이것이 옳은가 틀린가? 상충되는 의견을 계속 받기 때문에 누군가 나에게 설명해 주시겠습니까 ... 고마워요!

답변

8

당신의 @property 객체의 선언하는 경우 retain 또는 copy, 당신은 dealloc에서 그들을 석방해야합니다. 여기에는 아울렛이 포함됩니다.

+2

감사합니다. "alloc, copy or retain"에 대한 규칙을 들었지만 XIB가로드 될 때이를 유지한다는 사실을 실제로 고려하지 않았습니다. 이걸 내 마음에 새겨 넣을거야! – jowie

1

IBOutlet을 사용하면 변수가 Interface Builder에서 연결되도록 노출되고 뷰 컨트롤러가 초기화 될 때 할당됩니다. 따라서 뷰 컨트롤러가 언로드되고 할당이 해제 될 때 해제 및 할당 해제가 필요합니다. 대부분의 IBOutlet은 유지 된 UI * 속성이므로이 작업이 필요합니다.

변수에 nils를 할당하면 기술적으로 할당이 해제되지 않습니다. 실제로 할당 해제되기 직전에 count 0을 유지하는 마지막 상태 일뿐입니다.

또한 자체를 사용하여 참조됩니다. 이는 뷰 컨트롤러로부터의 참조가 할당이 아닌 nil이된다는 것을 의미합니다. 결론에서 이렇게

가 함께 IBOutlet 속성은()

(나는 꽤 확신하지만, 다른 사람이 100 % 정답을 제공 할 수 있습니다.)

+0

도트 형식의 접근자를 사용하여 속성을 nil로 설정하고 속성이 (보유) 유형 인 경우 이전에 있던 객체를 모두 해제합니다. 속성 설정 기는 다음과 유사합니다 (의사 코드) [myProperty release]; myProperty = newObject; [newObject retain]; – averydev

1

기본, 안전 패턴은 할당 해제에 발표해야

  • 선언 바르
  • 는 할당 해제
  • 에서
  • 릴리스 속성 바르에 함께 IBOutlet의 속성을 선언
  • 은 결코

이 XIB 처음이되었을 수 있습니다 무엇 해제 속성을 설정합니다 바르없고, 속성을 참조.

나는 그 누수가 왜 있었는지 약간 혼란 스럽다. 속성을 nil로 설정하면 이전 참조가 해제됩니다. 아마 viewDidUnload도 호출되지 않았을까요? viewDidUnload가 필요하십니까?

+0

예, viewDidUnload가 호출되지 않았습니다. 나는 Stack을 둘러 보았고 많은 사람들이 이것을 말하고 있습니다 ... OS가 다시 필요할 경우를 대비해 캐시에 저장 한 것 같습니다. viewDidUnload는 메모리 경고가있을 때 호출되는 것으로 생각되지만 주어진 것은 아닙니다. – jowie

관련 문제