當用Objective-C編譯器編譯時,Grand Central Dispatch對象的行爲與Objective-C對象相同。但這對我來說有點不清楚。實際上,Objective-C對象至少有一個字段:指向對象類結構的指針(isa
指針)。其他字段(如果有的話)對應於對象的ivars。作爲Objective-C對象的GCD對象
那麼,GCD對象可以被轉換爲其第一個字段是指向Objective-C類結構的指針的結構嗎?由於調度對象參與ARC,因此編譯器會做什麼:它是否將retain
和release
消息發送給對象(例如,如objc_msgSend(obj, @selector(retain))
),還是生成dispatch_object_retain
和dispatch_object_release
調用?我的意思是,GCD對象是否以[obj mesg]
的方式響應ObjC消息?
但調度vtable必須等同於一個ObjC類。我的意思是,它必須有一個緩存,一個超類指針以及一個包含內部類和數據類的結構,用於內省和消息處理。這真的發生了嗎? – LuisABOL 2013-05-05 00:24:25
如果它接收到一個調度對象,'object_getClassName()'返回什麼?我可以自己測試它,但本月我沒有使用我的Mac ... – LuisABOL 2013-05-05 00:42:35
它必須足夠用於objc_msgSend才能工作,是的(因爲在派遣類型中添加分支會太慢) – 2013-05-05 00:43:15