当使用Objective-C编译器编译时,Grand Central Dispatch对象的行为类似于Objective-C对象。但这对我来说有点不清楚。
Objective-C对象实际上是至少有一个字段的结构:指向对象类结构的指针(isa
指针)。其他字段(如果有)对应于对象的ivars。
那么,可以将GCD对象转换为第一个字段是指向Objective-C类结构的指针的结构吗?由于调度对象参与ARC,编译器会做什么:它是向对象发送retain
和release
消息(例如objc_msgSend(obj, @selector(retain))
)还是生成dispatch_object_retain
和dispatch_object_release
来电?我的意思是,GCD对象是否以[obj mesg]
方式响应ObjC消息?
答案 0 :(得分:6)
GCD对象是实际对象,编译器不会特别对待它们。您可以将它们添加到Cocoa集合中,在调试器中添加它们等等......
但是,运行时确实对它们进行了一些特殊处理。他们的isa指针指向调度vtable而不是常规的ObjC类。