2012-05-18 3 views
0

내 TheTabBarController에서 UINavigationControllerDelegate 프로토콜을 준수하지 않고 moreNavigationController.delegate에 클래스를 할당 할 수 있습니다.프로토콜을 따르지 않고 구현하는 방법

// without conforming to protocol, <UINavigationControllerDelegate> 
@interface TheTabBarController : UITabBarController 

self.moreNavigationController.delegate = self; 

단지 다음과 같은 경고를 발생 시키지만 성공적으로 컴파일됩니다. '* const를 __strong TheTabBarController'

프로토콜의 방법은 오류없이 실행시에 호출 호환되지 않는 유형에서 'ID'로 지정

. 일부보기 컨트롤러에 대해 더 많은 탐색 모음을 숨기는 데 사용합니다.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 

이렇게 알고 싶습니다.이 법적 또는 안전합니다. 나중에 충돌하거나 메모리가 누출됩니까? 이것이 의미 론적으로 어떻게 허용 될 수 있는가? 인터페이스와 프로토콜에 정의되지 않은 메소드가 어떻게 준수되지 않더라도 런타임은 메소드를 어떻게 해결할 수 있습니까? 또는 UITabBarController는 프로토콜을 준수하는 숨겨진 범주를 사용합니까?

답변

1

프로토콜에는 런타임 의미가 없습니다. 컴파일하는 동안 형식 오류를 표시하는 데만 사용됩니다. 프로토콜을 구현하는 경우 TheTabBarControllerUINavigationControllerDelegate으로 바꾸지 않으시겠습니까?

Objective-C에서는 모든 개체에 대해 메서드를 호출 할 수 있으며 forwardInvocation:(NSInvocation *)anInvocation 또는 관련 메서드 중 하나를 구현하여 처리 할 수 ​​있습니다. objc_install_instance_method 및 관련 함수를 사용하여 런타임에 객체 또는 클래스에 새 메서드를 추가 할 수도 있습니다.

관련 문제