Erreur du plugin IDE Xcode personnalisé: "Impossible de find la class nommée …"

J'ai développé mon propre Xcode .ideplugin pour append un object personnalisé au volet Bibliothèque d'objects de Xcode. J'ai mon model d'object personnalisé basé sur une class I appelée IBMyCustomObject, qui à son tour a un runtimeClassName d'une class I appelée MyCustomObject (un nom de class d'exécution est le nom de la class qui sera instancié à l'exécution lorsque le file Xib est chargé) .

Après des tonnes de searchs, j'ai réussi à faire fonctionner ça. Je peux maintenant faire glisser et déposer mon object personnalisé depuis le volet de la bibliothèque d'objects vers les files Xib normalement, définir les propriétés de l'object dans le volet de l'inspecteur, et tout le rest fonctionne très bien. Le seul problème vient à la compilation, où ibtool de Xcode me donne l'erreur suivante lorsque le file Xib est compilé:

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

Et voici le journal backtrace exception complète:

 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 comstackNibForRequest: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:{ } 

Des idées sur comment puis-je avoir Xcode (plus spécifiquement ibtool) au sujet de la class MyCustomObject pour qu'elle puisse le find au moment de la compilation? J'ai essayé beaucoup de choses, y compris placer MyCustomObject dans un cadre et charger le bundle à l'exécution, mais rien n'a fonctionné du tout. Si je remplace runtimeClassName de IBMyCustomObject par NSMutableDictionary (ou toute autre class Foundation ou UIKit) au lieu de MyCustomObject, tout fonctionne parfaitement, mais j'ai vraiment besoin d'utiliser ma propre class MyCustomObject à la place.

PS: Pour tous ceux intéressés par le développement de plugins similaires, je poserai toutes mes conclusions dans un article de blog détaillé sur sensiblecocoa.com (le framework utilisant le plugin) une fois que j'aurai tout compris.

Ok, il s'avère que Xcode (plus précisément ibtool) génère un process entièrement nouveau appelé "Interface Builder Cocoa Touch Tool" lors de la compilation, ce qui explique pourquoi le chargement du bundle MyCustomClass n'a eu aucun effet. Une solution possible à cela que j'ai envisagée était l'utilisation de dylib injection pour injecter la bibliothèque MyCustomClass dans le process nouvellement créé, mais aucune des techniques que j'ai trouvées n'était suffisamment fiable pour un code de production robuste et stable.

J'ai finalement fini par utiliser NSMutableDictionary au lieu de MyCustomClass , qui a parfaitement compilé. J'ai ensuite utilisé une méthode de propriété setter dans la class de propriétaire d'object pour convertir le NSMutableDictionary chargé en MyCustomClass , puis assigné manuellement toutes les keys de dictionary à leurs propriétés respectives. Comme je l'ai déjà dit, je postrai tous les détails de développement du plugin sur la page du blog sensiblecocoa.com .