我正在做一些代碼重構,但遇到一個問題,clang 對這種情況沒有任何警告:
@protocol CommonProtocol <NSObject>
- (void)common;
@end
=========
@interface Foo : NSObject <CommonProtocol>
- (void)foo;
@end
=========
@interface Bar : NSObject <CommonProtocol>
@end
=========
static id<CommonProtocol> getObject(void) {
return [Bar new];
}
Foo *casting = getObject(); /// ?? there is no warning for this
[casting common];
[casting foo]; /// ?? crash because the casting object do not respond to '-foo'
我認為型別 'Foo *' 和 'id<CommonProtocol>' 不可互換,并且正在尋找一種宣傳此警告的方法。任何編譯標志來實作這一點?
注意:我嘗試了“-Weverything”,但它仍然沒有顯示轉換警告。
uj5u.com熱心網友回復:
這是 Objective-C 的弱型別系統的自然結果,其中id
可以虛擬地向下轉換為任何型別的物件。專門id
使用給定的協議在這個方向上沒有多大幫助,這就是為什么你很容易遇到意想不到的情況,比如當前的情況。
如果您想強制轉換,一種解決方案是將簽名更改getObject
為 returnNSObject
而不是id
:
static NSObject<CommonProtocol> *getObject(void) {
return [Bar new];
}
有了這個設定,天真的Foo *casting = getObject();
會產生一個明確的警告:
使用“NSObject *”型別的運算式初始化“Foo *”的不兼容指標型別
,撰寫代碼的人必須明確地轉換:
Foo *casting = (Foo *)getObject();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/490032.html