2012-12-24 1 views
1
UIViewController *viewController = [[UIViewController alloc] init]; 
UIView *view1 = [[UIView alloc] init]; 
[viewController.view addSubview:view1]; 
[view1 release]; 

release viewController를 원한다면;UIViewController subviews release?

[viewController release]; 

내가 release release 전에 수동으로 view1 필요합니까?

UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0]; 
[view release]; 
[viewController release]; 

이 작업을 수행해야합니까? 또는 viewController를 그냥 놓으시겠습니까?

답변

2

아니요, 그렇게하지 않아도됩니다. viewController을 출시하면 내부적으로 모두 subviews이 해제됩니다. 나머지는 프레임 워크별로 처리됩니다. 당신은 ARC를 사용하지 않는 경우 한 번 모두 viewControllerview1을 할당 한 이후

, 당신의 코드는 위의 그림과 같이 한 번을 해제해야이 같은

UIViewController *viewController = [[UIViewController alloc] init]; 
UIView *view1 = [[UIView alloc] init]; 
[viewController.view addSubview:view1]; 
[view1 release]; 

[viewController release]; 

을 찾을 것입니다. 당신은 그 이후에 아무런 일도하지 않기 때문에 다시 릴리스를하지 않아도됩니다.

이렇게하면

,

UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0]; 
[view release]; 

두 번을 방출하기 때문에 viewController가 해제되고 viewController's 파단도 내부적으로 발표지고 때 주로 충돌이 발생합니다. 여기서주의해야 할 것은 한 번

Apple documentation.

에 추가 할 수있는 전망을 언급 한 바와 같이 addSubviewview1을 유지한다는 것입니다. 이보기는 수신자가 보유합니다. 추가 된 후에이보기는 다른 하위보기 위에 나타납니다.

viewController이 출시되면 출시 될 예정이며 직접 소유하지 않으므로 수동으로 해제해야합니다.

1

올바른 방법입니다.

UIViewController *viewController = [[UIViewController alloc] init]; 
UIView *view1 = [[UIView alloc] init]; 
[viewController.view addSubview:view1]; 
[view1 release]; 
[viewController release]; 

뷰를 하위보기로 추가하면 뷰 컨트롤러에서 유지됩니다. addSubview :

수신자의 하위보기 목록 끝 부분에보기를 추가합니다.

- (void)addSubview:(UIView *)view

매개 변수

보기

The view to be added. This view is retained by the receiver. After being added, this view appears on top of any other subviews. 

토론

이 충족 hod는보기를 유지하고 수신자에게 다음 응답자를 설정합니다. 새로운 슈퍼 뷰인 입니다.

보기에는 수퍼 뷰가 하나만있을 수 있습니다. 보기에 이미 수퍼보기가 있고보기가 수신기가 아닌 인 경우이 방법은 수퍼바이저를 새로운 수퍼 뷰로 만들기 전에 이전 수퍼 뷰 을 제거합니다.

참조 UIView

중요 : 뷰 컨트롤러는 뷰의 단독 소유자 및이 생성 어떤 파단이다. 뷰 컨트롤러 자체가 해제 될 때이 같은 로 적절한 시간에 그 소유권을 포기에 대한 그 전망과 를 만들기위한 책임이

참조 : UIViewController Class

UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0]; 
[view release]; 

그것은 확실히 충돌 것 당신은 viewController에서 release를 호출합니다.

+1

보기가 계속 표시 될 때 어떻게보기 컨트롤러를 해제 할 예정입니까? – sergio

관련 문제