考慮:ObjC選擇器/塊簽名比預期更強大但類型安全性更低? (自動 「不安全」 鑄造)
[self.staves enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
HBStaffView * sv = (HBStaffView *) obj ;
[sv flush] ;
}] ;
和:
[self.staves enumerateObjectsUsingBlock:^(HBStaffView * sv, NSUInteger idx, BOOL *stop) {
[sv flush] ;
}] ;
兩個編譯,兩者的工作。
我知道我在枚舉的數組中有什麼,因此編譯器需要將類型轉換爲正確的類型,以便將正確的類型直接傳遞給我,我需要如何使用它顯然是福音。
有趣的是,在這裏,塊簽名是一個「C」語言簽名,與選擇器無關,並且對於對象一無所知(理論上),當然不是「id」是超類一切(可以鬆散地說)。
嗯?註釋?
最後一個nitpick:'id'肯定不是NSObject * 。基金會中有更多的基礎課程。 – CodaFi
只需完成CodaFi評論:id是typedef struct objc_object *(請參閱objc/objc.h)。 NSProxy是另一個根類。 – Emmanuel
'id'不僅是'NSObject *',而且兩者甚至都沒有相同的工作。 'id'表示「對任何曾經見過的選擇器做出響應」,而「NSObject *」表示「只響應在'NSObject'上聲明的選擇器。 – bbum