我從「Objective C中的編程」中的示例中有一個名爲AddressCard的類,並且我實現了一個isEqual:方法。當重寫方法時嚴格與寬鬆輸入
在NSObject的這種方法的簽名使用弱類型的參數:
- (BOOL)isEqual:(id)anObject
OTOH,書中的示例代碼使用嚴格類型:
- (BOOL) isEqual:(AddressCard *) aCard
我不知道我充分了解編譯器在這種情況下所做的工作。我嘗試將AddressCard與NSString([aCard isEqual: @"Foo"]
)進行比較,期望運行時錯誤(如果系統使用我的方法)或系統會調用NSObject的IsEqual版本。
相反,我的方法被調用(即使參數是一個的NSString而不是AddressCard),並提出了一個異常時,我ISEQUAL:試圖打電話給AddressCard具體AA方法:
- (BOOL) isEqual:(AddressCard *) aCard {
if ([name isEqualToString: [aCard name]] && /*here I get the error*/
[email isEqualToString:[aCard email]]) {
return YES;
}else {
return NO;
}
}
這是怎麼回事?在地球上如何將NSString傳遞給期望別的東西的方法?覆蓋它時是否改變方法的簽名?
根本沒有警告。它只是在運行時引發異常。 – cfischer 2010-10-17 18:50:16
我一定會期待一個警告。似乎有點草率... – cfischer 2010-10-17 18:51:22
順便說一句,如果我改變我的isEqual:方法的簽名,所以它匹配NSObject的我會得到一個警告:「衝突類型' - (BOOL)isEqual:(id *)aCard。 ?O :-) – cfischer 2010-10-17 19:42:10