2017-12-18 410 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 {}