2011-09-12 2 views
1

UIView 컨트롤러를 릴리스하는 데 문제가 있습니다. 이것이 제 코드입니다. 이 일어나고목표 c - UIVIewController를 해제하는 올바른 방법

viewT = [[PersonalViewController alloc] initWithNibName:@"PersonalViewController" bundle:[NSBundle mainBundle]]; 
//In this moment the retainCount is 1 
[[AppDelegate appDelegate].window insertSubview:viewT.view aboveSubview:[AppDelegate appDelegate].dockController.view]; 
[viewT release]; 
//Now the retain count is 3! 

//... After some code, when the user press another button, I want to release the view 
[viewT.view removeFromSuperview]; 
//After this line, the object stills there, with a retain of 2. 

그래서 뭔가를 내가 이해가 안 : 나는 버튼을 누르면 , 나는 모든 것을 앞에 화면에보기를 넣습니다. 나는 기억에 관한 가이드를 읽고 있었고, 나는 전에 이런 의심을 품지 못했다. 내가 뭘 잘못하고 있니? viewT을 어떻게 완전하게 풀 수 있습니까 ???

+0

autorelease로 시도해 보셨습니까? – Maffo

+0

고맙습니다. 해결책 일 수 있지만, 내가 superview에서 제거 할 때까지보기가 해제되지 않을 것이라고 확신 할 수 있습니까? –

+2

그래서 'retainCount'를 사용하지 않아야합니다. 귀하의 코드는 괜찮습니다; 당신이 만든 물건을 놓았습니다. 그것이 중요합니다. – Abizern

답변

4
  • 당신은

당신은 이름이 "ALLOC" "새로운", "복사"또는 "mutableCopy"(로 시작하는 방법을 사용하여 객체를 만들 때 생성 한 모든 객체를 소유 예 : alloc, newObject 또는 mutableCopy).

  • 더 이상 필요하지 않을 때, 당신은 당신이 그것을 해제 메시지 또는 오토 릴리즈 메시지를 전송하여 개체의 소유권을 포기하면

을 자신이 소유 개체의 소유권을 포기해야한다 . 따라서 코코아 용어에서 객체의 소유권을 포기하는 것은 일반적으로 이라고 불리우며 객체를 "해제"합니다.

  • 당신은 이전 정책 규칙의

이것은 단지 추론을 소유하지 않은 오브젝트의 소유권을 포기해서는 안, 명시 적으로 을 밝혔다.

Memory Management Programming Guide

그래서, 당신은 당신은 아마 유지주기가 코드

[viewT release]; 
+4

또한'retainCount'에 대해서 : _이 메소드는 일반적으로 메모리 관리 문제를 디버깅 할 때 아무런 가치가 없습니다.프레임 워크 객체의 수는 객체에 대한 참조를 유지하기 위해 유지 되었기 때문에 동시에 자동 릴리즈 풀은 객체에 지연 릴리스 수에 제한이 없으므로이 객체에서 유용한 정보를 얻을 수있는 가능성은 거의 없습니다. method._ – beryllium

+0

그래서 내 코드에서 viewT의 dealloc은 호출되지 않았습니까? –

+0

나는 그것이 결코 부르지 않았던 이유를 의미했다? –

1

의 한 줄이 필요합니다. 펜촉의 어떤 물체도 File 's Owner에 연결된 콘센트를 가지고 있습니까? 그 콘센트가 retain으로 선언 되었습니까? (또는 ARC를 사용하는 경우 strong, 그렇지 않은 경우) 콘센트를 assign (또는 ARC를 사용하는 경우 weak)으로 변경하십시오.