【问题标题】:GCD objects as Objective-C objectsGCD 对象作为 Objective-C 对象
【发布时间】:2013-04-29 01:49:24
【问题描述】:

Grand Central Dispatch 对象据说在使用 Objective-C 编译器编译时表现得像 Objective-C 对象。但这对我来说有点不清楚。

Objective-C 对象实际上是至少具有一个字段的结构:指向对象类结构的指针(isa 指针)。其他字段(如果有)对应于对象的 ivars。

那么,可以将 GCD 对象转换为第一个字段是指向 Objective-C 类结构的指针的结构吗?由于调度对象参与 ARC,编译器会做什么:它是向对象发送retainrelease 消息(例如objc_msgSend(obj, @selector(retain)))还是生成dispatch_object_retaindispatch_object_release 调用?我的意思是,GCD 对象是否以 [obj mesg] 方式响应 ObjC 消息?

【问题讨论】:

    标签: objective-c grand-central-dispatch objective-c-runtime


    【解决方案1】:

    GCD 对象是实际的对象,编译器不会对它们进行特殊处理。您可以将它们添加到 Cocoa 集合中,在调试器中将它们放入等等...

    但是,运行时确实对它们进行了一些特殊处理。它们的 isa 指针指向 dispatch vtable 而不是常规的 ObjC 类。

    【讨论】:

    • 但是dispatch vtable必须等价于一个ObjC类。我的意思是,它必须有一个缓存、一个超类指针和一个包含类数据的结构,用于自省和消息处理。这真的会发生吗?
    • object_getClassName() 收到一个调度对象会返回什么?我可以自己测试它,但是这个月我没有 Mac……
    • 它必须足够等效才能使 objc_msgSend 工作,是的(因为在其中添加一个用于调度类型的分支会太慢)
    • 它返回各种 OS_object 类之一
    • OS_dispatch_queue,是的
    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 2011-01-29
    • 2023-03-18
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2010-12-22
    相关资源
    最近更新 更多