2

當用Objective-C編譯器編譯時,Grand Central Dispatch對象的行爲與Objective-C對象相同。但這對我來說有點不清楚。實際上,Objective-C對象至少有一個字段:指向對象類結構的指針(isa指針)。其他字段(如果有的話)對應於對象的ivars。作爲Objective-C對象的GCD對象

那麼,GCD對象可以被轉換爲其第一個字段是指向Objective-C類結構的指針的結構嗎?由於調度對象參與ARC,因此編譯器會做什麼:它是否將retainrelease消息發送給對象(例如,如objc_msgSend(obj, @selector(retain))),還是生成dispatch_object_retaindispatch_object_release調用?我的意思是,GCD對象是否以[obj mesg]的方式響應ObjC消息?

回答

6

GCD對象是實際的對象,編譯器不會特別對待它們。你可以將它們添加到Cocoa集合中,將它們放在調試器中,等等......

但是,運行時確實爲它們做了一些特殊處理。他們的isa指針指向dispatch vtable,而不是常規的ObjC類。

+0

但調度vtable必須等同於一個ObjC類。我的意思是,它必須有一個緩存,一個超類指針以及一個包含內部類和數據類的結構,用於內省和消息處理。這真的發生了嗎? – LuisABOL 2013-05-05 00:24:25

+0

如果它接收到一個調度對象,'object_getClassName()'返回什麼?我可以自己測試它,但本月我沒有使用我的Mac ... – LuisABOL 2013-05-05 00:42:35

+0

它必須足夠用於objc_msgSend才能工作,是的(因爲在派遣類型中添加分支會太慢) – 2013-05-05 00:43:15