【问题标题】:Objective-C: Compiler warning for accidental method overrideObjective-C:意外方法覆盖的编译器警告
【发布时间】: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


【解决方案1】:

你不能完全避免这些问题,这是 Objective C 中的预期行为。但是,如果你想保护你的私有方法不被意外覆盖,你可以在它们的名字前面加上你的库的标识符(或任何其他字符串你喜欢的),例如:

- (void)__mylib_hideView {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多