2017-06-15 71 views
0

說我有一個初始化基類中聲明爲NS_UNAVAILABLE:調用方法時未出現錯誤標記NS_UNAVAILABLE

@interface MyBase : NSObject 
-(instancetype)init NS_UNAVAILEBLE; 
@end 

和派生類(我們就叫它MyDerived),在其.M嘗試以實施初始化(可以說意外,因爲該方法並不實際可用):

@implementation MyDerived 
-(instancetype)init { 
    self = [super init]; 
    if(self){ 
    } 
    return self; 
} 

即使在init被調用父類被標記爲NS_UNAVAILABLE仍然沒有警告或錯誤將被拋出代碼編譯好。

但是,如果我們在派生類中的.h聲明我們的init:

@interface MyDerived : MyBase 
-(instancetype)init; 
@end 

然後將顯示一個錯誤!

這是預期的行爲,如果它是背後的原因是什麼?

+0

'extends'?我錯過了什麼。 –

+0

哎呀抱歉,剛開始輸入僞代碼並忘了更正 – J2K

回答

0

橋接到Swift時使用NS_UNAVAILABLE宏。一般而言,Swift對構造函數和方法調用的要求更嚴格,並且不允許調用使用此宏標記的方法。另一方面,Objective-C會讓你調用一個甚至不存在的方法。

此外,該宏意味着該方法對類的用戶不可用,而不是類本身。這就是爲什麼要求[super init]有效,但公開聲明不會。

+0

雖然在init方法內部(或者我認爲其他方法標記爲NS_UNAVAILABLE),但您也可以在其他對象中調用標記爲NS_UNAVAILABLE的方法Xcode顯示錯誤。就好像預處理器不會檢查標記爲NS_UNAVAILABLE的方法中的這些錯誤,這是我不明白的原因。 – J2K

+0

BTW:在Objective-C中,開發人員(開發人員的代碼)從不調用方法。它發送消息。雖然這在許多情況下並不重要,但在您的回答所描述的背景下,這非常重要。所以Objective-C允許將消息發送給實例,而不是(明確)實現該消息的方法。這是我的意圖。即它允許轉發 –

+0

@ J2K,如果您使用的方法對Swift不可用,則調用Swift不可用的其他方法並不重要。 很多Objc-C的Swift兼容性添加在與Obj-C本身一起使用時會出現轉角情況和怪異行爲。例如,通用容器。 – Avi

相關問題