【发布时间】:2017-12-18 11:17:20
【问题描述】:
我刚刚在我们的 iOS 应用程序中发现了一个错误,该错误是由意外的方法覆盖触发的。
在这种情况下,子类中的属性会覆盖超类中的“私有”方法。
@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 方法。
我的问题是如何预防这些问题?有编译器警告吗?
【问题讨论】:
-
编译器不能知道
hideView的存在,当它是私有的。对隐藏方法的唯一引用是在编译器无法访问的目标文件(框架/库)中。 -
我明白了,为什么这是不可能的。静态分析器可能会这样。由于类型不匹配,这绝对是一个错误情况。我想我要归档雷达
-
静态分析器也是基于编译器的。它也无权访问目标文件。
标签: objective-c xcode llvm-clang clang-static-analyzer