2009-05-01 2 views
3

UIViewController (UINavigationController 아님)를 수동으로 만들고 해당 컨트롤러 뷰를 하위 뷰로 추가하는 주 뷰가 있습니다.removeFromSuperview를 통해 뷰를 제거 할 때 UIViewController를 해제합니다.

하위 뷰는 [self removeFromSuperview]를 통해 자신을 닫습니다. 나는이보기를 해제 이해, 그래서 지금은 또한 얻으려면 원하는 UIViewController 제거 할 때 바로 내가보기를 메모리를 확보하고 주보기 컨트롤러가 dealloc'ed 때까지 기다리지 않는 즉시 alloc'ed .

removeFromSuperview를 사용하지 않고 주 뷰 컨트롤러에 대한 역 참조를 사용하여 하위 뷰를 닫고 컨트롤러를 릴리스 할 수 있지만 클리너 방식이 있어야하는 것처럼 느껴질 수 있습니다.

이 작업을 수행하기위한 최상의 방법이 있습니까?

답변

5

올바른 방법은 하위 컨트롤러가 주 컨트롤러에이를 제거하도록 요청하는 것입니다. 당신은 두 개의 컨트롤러 사이의 커플 링을 줄이려면, 당신의 subcontroller에 대한 위임 프로토콜을 만들 :

// This forward declaration avoids having a circular dependency 
// between MySubcontroller and MySubcontrollerDelegate 
@class MySubcontroller; 

@protocol MySubcontrollerDelegate 

- (void)hideMySubcontroller:(MySubcontroller*)subcontroller; 

@end 

을 subcontroller가 supercontroller와 통신하는 데 필요한 기타 정보가있는 경우,이 관련 추가 할 수있는 좋은 장소입니다 전화. 지금 당장 그렇게 할 필요는 없지만 이후 버전의 앱을 염두에 두시기 바랍니다.

그런 다음 subcontroller에 delegate 속성을 추가 :

@interface MySubcontroller : UIViewController { 
    id <MySubcontrollerDelegate> delegate; 
    ... 
} 
@property (assign) id <MySubcontrollerDelegate> delegate; 
... 
@end 

대신 해당 뷰에 removeFromSuperview를 호출의 subcontroller는 인수로 self을 통과, 그 위임에 hideMySubcontroller:를 호출해야합니다.

메인 컨트롤러는 다음이 위임 프로토콜을 구현 함을 선언한다 :

메인 컨트롤러가 subcontroller를 생성
@interface MyMainController : UIViewController <MySubcontrollerDelegate> 
... 
@end 

, 그것은 self에 subcontroller의 delegate 속성을 설정해야합니다. 그것은 서브 컨트롤러의 뷰를 제거하고, 서브 컨트롤러를 할당 해제하고, 필요한 것이 무엇이든 수행하는 hideMySubcontroller: 메소드를 구현해야한다.

대리자 프로토콜을 사용한다는 것은 서브 컨트롤러가 어떤 종류의 개체를 사용할 지에 대한 지식이 필요 없다는 것을 의미합니다. 어딘가에 그러한 객체가 있다는 것을 알고 대리인 프로토콜을 따르게됩니다. 따라서 두 컨트롤러 간의 커플 링은 가능한 작게 유지됩니다.

그런데 그것을 관리 할 수 ​​있다면 실제로 다시 사용할 필요가 있기 때문에 서브 컨트롤러를 계속 유지하는 것이 좋습니다. 다시 작성하는 데 걸리는 처리 시간이 절약됩니다. (그러나 메모리 경고를 받으면 해제해야합니다.)

관련 문제