【问题标题】:How do I access the source level definition of classes at runtime?如何在运行时访问类的源代码级定义?
【发布时间】:2014-03-02 20:38:42
【问题描述】:

如何访问在(预或实际)编译时从头文件中收集的 Objective-C 类接口定义,以便我可以提供对定义的公共接口真实的内省。

问题:F-Script、SuperDB、IKBClassBrowser、CBIntrospection 使用 class_copyPropertyList() 系列函数在运行时自省对象。虽然功能强大,但也有缺点……

  1. 运行时没有私有和公共的概念……一切都是 返回
  2. 我看不到访问 ObjC 类型的可靠方法 方法参数和返回

目标:我正在研究一个 iOS 应用程序,以帮助通过实时/即时开发环境教授编码(类似于 SmallTalk、F-Script、SuperDB、IKBClassBrowser、CBIntrospection)。我希望用户通过 VM 内省对象、发送消息、创建新对象以及构建和运行代码。 但我想将功能限制为公共功能(否则 Apple 不会批准该应用程序)并且 我想访问类型,所以我限制了用户只能传递合法对象.

我希望有某种方法可以访问 Clang符号文件 来提取这些信息,以便我可以在运行时使用它。它不必完全自动化(我可能想在某些方面限制功能)

【问题讨论】:

    标签: ios xcode clang objective-c-runtime f-script


    【解决方案1】:

    您遇到了 Objective-C 的显着特征之一:没有私有或公共 API 之类的东西。只有记录的 API 与未记录的 API。您可以随时对任何对象调用任何方法,无论它是否出现在头文件中。公共/私有区别仅存在于编译器;在运行时,它们是不存在的,并且没有办法逆转这个过程并辨别头文件可能说了些什么。

    【讨论】:

    • 我认为您没有理解我的问题 - 我想构建一个在源代码中定义的公共接口模型,并在运行时使用它来限制我向用户公开的内容.我推测有很多方法可以做到这一点。例如,我可以一次获取每个类,并从它的公共接口构建我自己的数据结构 - 但我推测编译器在编译时生成的数据可以解析来执行此操作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多