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