2017-12-18 413 views
1

我才发现这是由一个偶然的方法重写引发了我们的iOS应用程序中的错误。的Objective-C:编译器警告意外方法覆盖

在这种情况下,子类中的属性将覆盖在父类“私人”的方法。

@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 

如果[self hideView]doSomething方法中调用,该方法hideView不调用。相反,只是财产被要求其价值。我明白为什么会发生这种情况,但这是一种容易出错的情况,因为子类不知道hideView方法。

我的问题是如何避免这些问题?有没有编译器警告?

+0

编译器在隐藏时无法知道“hideView”的存在。隐藏方法的唯一参考是编译器无法访问的目标文件(frameworks/libs)。 – clemens

+0

我明白了,为什么这是不可能的。静态分析器可能是这样的。由于类型不匹配,这绝对是一个错误的情况。我想我要提交一个雷达 – cornr

+0

静态分析器也是基于编译器。它也无法访问目标文件。 – clemens

回答

1

你不能完全避免这些问题,这是客观C.预期的行为,但是,如果你想防止意外重写你的私有方法,你可以用你的库的标识符(或任何其他前缀他们的名字例如:

- (void)__mylib_hideView {}