2010-01-29 3 views
0

저는 iPhone 개발에 익숙하지 않고 기본 창에서 하위보기를 제거하는 데 문제가 있습니다. 문제는 removeFromSuperview를 호출 한 후에도 뷰가 여전히 표시된다는 것입니다.removeFromSuperview가 내 iPhone 응용 프로그램에서 UIView를 숨기지 않는 이유는 무엇입니까?

하위 뷰를 생성하고이 코드를 통해 디스플레이 트리에 추가됩니다 나중에 그런

// Instantiate the controller for the authentication view 
AuthenticationController* controller = [AuthenticationController alloc]; 
[controller initWithNibName:@"AuthenticationView" bundle:[NSBundle mainBundle]]; 
authController = controller; 

// Add the authentication view to the window 
[[stateManager appWindow] addSubview:[authController view]]; 

, 나는이 코드는 중단 점을 설정하여 실행되는 것을 확인 한이 난 어떻게 보기 제거하기 :

- (void)dealloc { 
    [authController release]; 
    [super dealloc]; 
} 
: 그것은 중요한 경우

[[authController view] removeFromSuperview]; 

을, 여기에 뷰 컨트롤러의 소유자의를 수행하는 할당 해제 코드입니다3210

이 하위보기가 계속해서 표시되는 원인은 무엇입니까?

답변

0

이 작업이 있습니다. 외관상으로는 뷰가 할당 해제 될 때까지보기가 사라지지 않고이 플랫폼에서 메모리 관리가 작동하는 방식에 대한 오해가있었습니다. 수정 된 코드는 다음과 같습니다.

AuthenticationController* controller = [[AuthenticationController alloc] 
initWithNibName:@"AuthenticationView" bundle:[NSBundle mainBundle]]; 
controller.delegate = self; 
authController = controller; 
[controller release]; // <-- Problem was that a reference was being maintained 
[[stateManager appWindow] addSubview:[authController view]]; 
+4

작동하지 않는 것 같습니다. 'initWithNibName :'메소드는 보유 개수가 1 인 컨트롤러를 생성합니다. 여러분은 그것을 유지하지 않고'authController' (인스턴스 변수라고 가정합니다)를 할당합니다. 그런 다음 retain count를 0으로 다시 설정하고 객체를 할당 해제해야합니다. 마지막 줄에 올 때,'authController'가 없어야합니다. –

+0

귀하의 평가가 정확하다고 생각하지 않습니다. 'authController'는 참조를 유지하는 속성입니다. 그래서 나는 [컨트롤러 릴리즈]'를하기 전에 객체의 보유 카운트가 2이고, '탈퇴'중 '릴리즈'는 객체를 해제하지 않았습니다. – Jacob

+0

@ Jacob - 여기에 Squeegy가 맞습니다. 당신이 말하는 것은 ** 당신이 self.authController = controller; 가지고 계시 겠지만 컨트롤러를 유지하지 않으므로 authController에 할당 한 포인터에 액세스 할 때 잘못된 메모리 참조가 표시됩니다. – DougW

-1

"표시"란 무엇을 의미하는지 확실하지 않습니다. 화면에? 기억에?

당신의 "수정"이 버그가있는 것처럼 보이는데, alloc은 당신에게 하나의 참조를주었습니다. 그런 다음 그것을 풀어서 AuthenticationController를 제거합니다. 그런 다음 사용합니다.

보기를 읽기 전에 컨트롤러를 덮어 쓰는 사람이 없기 때문에이 방법이 효과가있는 것처럼 보일 수 있지만 문제를 묻는 것입니다.

+0

나는 화면에 나타낼 것을 의미했습니다. – Jacob

+0

귀하의 평가가 정확하다고 생각하지 않습니다. 내 코드에서,'authController'는 참조를 유지하는 속성입니다. 그래서 나는 [컨트롤러 릴리즈]'를하기 전에 객체의 보유 카운트가 2였습니다. 따라서, 'dealloc'중 'release'는 객체를 해제하지 않았습니다. – Jacob

+0

글쎄, 우리는 ESP가 없기 때문에 그것이 인스턴스 변수라고 생각하는 우리 둘을 만든다. (릴리스와 함께 사용했기 때문에). 속성 인 경우 해제하지 않고 nil로 설정합니다. –

관련 문제