Objective-C:编译器警告意外方法覆盖
Objective-C: Compiler warning for accidental method override
我刚刚在我们的 iOS 应用程序中发现了一个由意外方法覆盖触发的错误。
在这种情况下,子类中的 属性 覆盖超类中的 "private" 方法。
@interface MyClass : NSObject
- (void)doSomething;
@end
@implementation MyClass
- (void)doSomething {
[self hideView];
}
- (void)hideView {
}
@end
@interface MySubclass : MyClass
@property (NS_NONATOMIC_IOSONLY) IBInspectable BOOL hideView;
@end
@implementation MySubclass
@end
如果在doSomething
方法中调用了[self hideView]
,则不会调用hideView
方法。相反,只要求 属性 提供其值。我明白为什么会这样,但这是一个容易出错的情况,因为子类不知道 hideView
方法。
我的问题是如何预防这些问题?是否有编译器警告?
您无法完全避免这些问题,这是 Objective C 中的预期行为。但是,如果您想保护您的私有方法不被意外覆盖,您可以在它们的名称前加上您的库的标识符(或您喜欢的任何其他字符串),例如:
- (void)__mylib_hideView {}
我刚刚在我们的 iOS 应用程序中发现了一个由意外方法覆盖触发的错误。
在这种情况下,子类中的 属性 覆盖超类中的 "private" 方法。
@interface MyClass : NSObject
- (void)doSomething;
@end
@implementation MyClass
- (void)doSomething {
[self hideView];
}
- (void)hideView {
}
@end
@interface MySubclass : MyClass
@property (NS_NONATOMIC_IOSONLY) IBInspectable BOOL hideView;
@end
@implementation MySubclass
@end
如果在doSomething
方法中调用了[self hideView]
,则不会调用hideView
方法。相反,只要求 属性 提供其值。我明白为什么会这样,但这是一个容易出错的情况,因为子类不知道 hideView
方法。
我的问题是如何预防这些问题?是否有编译器警告?
您无法完全避免这些问题,这是 Objective C 中的预期行为。但是,如果您想保护您的私有方法不被意外覆盖,您可以在它们的名称前加上您的库的标识符(或您喜欢的任何其他字符串),例如:
- (void)__mylib_hideView {}