2017-11-08 7 views
0

Java, C++ 11 및 일부 다른 언어에서 메서드가 기본 클래스 또는 인터페이스의 다른 메서드를 재정의하도록 지정 될 수 있습니다. 나중에 해당 메서드를 제거하면 기본 클래스에서 컴파일러 오류가 발생합니다. 선택적 메서드를 많이 사용하는 프로토콜을 사용하고 거기에서 메서드를 제거하면 메서드를 구현 한 코드를 제거하는 것을 잊어 버릴 수 있습니다. 이것은 오류 또는 경고를 생성하지 않으므로 "죽은"방법을 만듭니다.Objective-C "Override"지정자

고려 : 한 지점에서 내가 프로토콜에서 tempBar를 제거하면

@protocol Prot <NSObject> 
@optional 
- (void)bar; 
- (void)tempBar; 
@end 

@interface MyType : NSObject <Prot> 
@end 

@implementation MyType 
- (void)bar { /**/ } 
- (void)tempBar { /**/ } 
@end 

것은, 나는 적어도 tempBar에서 경고가 MyType에서 구현되고 좀하고 싶습니다.

Objective-C에는 메서드가 프로토콜 메서드의 구현으로 예상되도록 지정하는 방법이 있습니까?

답변

1

Objective-C는 동적 언어이므로 컴파일시에는 적용하기가 다소 어렵습니다. Obj-C에서 실제로 거기에없는 메소드를 호출 할 수 있으며 앱이 다운되지 않습니다. (기본 구현에서는 예외가 발생하지만 해당 동작은 변경할 수 있습니다.)

메서드를 확장에 추가하거나 런타임에 추가 할 수도 있습니다. 또는 머리글에없는 것입니다.

또한 반대 문제가 있습니다. 서브 클래 싱 할 때 헤더에 존재하지 않기 때문에 모르는 메소드를 오버라이드 할 수 있습니다.

이것은 Apple이 예측 가능한 언어, 즉 Swift로 옮겨가는 이유 중 하나입니다.