2013年1月21日 星期一

Objective-C 的 id, NSObject* 和 id<NSObject> 和 dynamic binding 的運作方式

相關資料:

摘要心得:

  • id 類似 void*, 不等於 NSObject*。像是 NSProxy 沒有繼承自 NSObject。
  • 實務上不太會用到 NSObject*, 而會用到 id<NSObject>, 因為我們關心它是否符合 NSObject protocol, 不關心是否繼承自 NSObject。
  • id 實際上是 struct objc_object 的指標, 這個 struct 只有一個欄位 Class isa。而 [NSObject alloc] 會存型別資訊到 isa 裡, 所以 runtime 可以正確得知型別為 id 的物件是否有提供呼叫的方法。
  • id<SomeProtocol> 中多提到 SomeProtocol, 是協助編譯時的型別檢查。編譯器有愈多資訊, 愈能在編譯時找到錯誤, IDE 也有機會提供更多協助。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...