【问题标题】:Custom Xcode IDE Plugin error: "Could not find class named..."自定义 Xcode IDE 插件错误:“找不到名为...的类”
【发布时间】:2013-08-26 12:49:41
【问题描述】:

我开发了自己的自定义 Xcode .ideplugin 来将自定义对象添加到 Xcode 的 Object Library 窗格。我有一个基于名为 IBMyCustomObject 的类的自定义对象模板,该类又具有一个名为 MyCustomObject 的类的 runtimeClassName(运行时类名是加载 Xib 文件时将在运行时实例化的类的名称) .

经过大量研究,我已经能够成功完成这项工作。我现在可以正常地将自定义对象从“对象库”窗格拖放到 Xib 文件中,在检查器窗格中设置对象属性,其他一切都运行良好。唯一的问题出现在编译时,Xcode 的ibtool 在编译 Xib 文件时给了我以下错误:

Exception name: NSInvalidArgumentException
Exception reason: Could not find class named MyCustomObject

这里是完整的异常回溯日志:

Exception backtrace: 
  0. CoreFoundation           0x0226d6d8 __exceptionPreprocess
  1. libobjc.A.dylib          0x01fe98b6 objc_exception_throw
  2. CoreFoundation           0x022fd721 -[NSException raise]
  3. ???                      0x000116b8 [IBCocoaTouchToolObjectPackage initWithRequest:]
  4. ???                      0x00010597 [IBCocoaTouchTool .cxx_destruct]
  5. ???                      0x0000b63d [IBCocoaTouchTool compileNibForRequest:minimumCompatibility:layoutInfo:]
  6. IBFoundation             0x00362c51 __72-[IBMessageReceiveChannel deliverMessage:toTarget:withArguments:result:]_block_invoke
  7. IBFoundation             0x00362996 -[IBMessageReceiveChannel deliverMessage:toTarget:withArguments:result:]
  8. IBFoundation             0x00362673 __80-[IBMessageReceiveChannel runBlockingReceiveLoopNotifyingQueue:notifyingTarget:]_block_invoke
  9. libdispatch.dylib        0x029c2444 _dispatch_barrier_sync_f_slow_invoke
 10. libdispatch.dylib        0x029d34b0 _dispatch_client_callout
 11. libdispatch.dylib        0x029c1766 _dispatch_main_queue_callback_4CF
 12. CoreFoundation           0x022d2b6e __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
 13. CoreFoundation           0x022137eb __CFRunLoopRun
 14. CoreFoundation           0x02212bf3 CFRunLoopRunSpecific
 15. CoreFoundation           0x02212a0b CFRunLoopRunInMode
 16. Foundation               0x01c1fe55 -[NSRunLoop(NSRunLoop) runMode:beforeDate:]
 17. ???                      0x0003ac67 [IBAbstractCocoaTouchTool startServingReceiveChannel:]
 18. ???                      0x0003ad62 [IBAbstractCocoaTouchTool startServingSocket:]
 19. ???                      0x0003aec7 [IBAbstractCocoaTouchTool protocolCapabilities]
 20. ???                      0x0001053e [IBCocoaTouchTool .cxx_destruct]
 21. libdyld.dylib            0x9313d725 start
Exception info:{
}

关于如何让 Xcode(更具体地说是 ibtool)了解 MyCustomObject 类以便它可以在编译时找到它的任何想法?我尝试了很多事情,包括将 MyCustomObject 放在框架中并在运行时加载包,但根本没有任何效果。如果我将 IBMyCustomObject 的 runtimeClassName 替换为 NSMutableDictionary(或任何其他 Foundation 或 UIKit 类)而不是 MyCustomObject,则一切正常,但我确实需要改用我自己的 MyCustomObject 类。

P.S.:对于所有对开发类似插件感兴趣的人,一旦我弄清楚了一切,我将在 sensiblecocoa.com(使用插件的框架)上的详细博客文章中提出我的所有发现。

【问题讨论】:

  • 同样的问题仍然适用于 Xcode 4。
  • 您可能想通过删除 Xcode5 主题来澄清这一点?! ..只是说
  • 会做的,谢谢@Till。
  • @Till NDA 不会发布主题。
  • 好的 - 让我澄清一下我最初的投票(已经回溯 - 它得到了 2 票接近,现在降到了 1 票)。我从来没有提到任何关于保密协议的事情。我的角度不同;如果软件开发人员(或供应商)发布了预发布版本,他通常这样做是出于一个原因;收集问题报告。如果这些问题报告发布在开发人员网站以外的任何地方,他很可能永远不会得到反馈。但再一次,这是我个人的看法,社区可能会做出不同的决定,这就是 SO 的酷炫之处。

标签: ios objective-c xcode cocoa-touch cocoa


【解决方案1】:

好的,事实证明 Xcode(更具体地说是 ibtool)在编译期间产生了一个名为“Interface Builder Cocoa Touch Tool”的全新进程,这解释了为什么加载 MyCustomClass 包没有效果。我考虑过的一种可能的解决方案是使用 dylib 注入将 MyCustomClass 库注入新生成的进程中,但我发现的技术都不足以可靠地用于健壮和稳定的生产代码。

我最终使用了NSMutableDictionary 而不是MyCustomClass,它编译得很好。然后我在对象所有者类中使用setter属性方法将加载的NSMutableDictionary转换为MyCustomClass,然后手动将所有字典键分配给它们各自的属性。正如我之前所说,我将在sensiblecocoa.com 博客页面上发布所有插件开发细节。

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2021-09-12
    相关资源
    最近更新 更多