vinculación de categorías objective-c en una biblioteca estática

Estoy desarrollando un complemento para una aplicación de iOS. Estoy comstackndo en un file .a que luego es utilizado por el proyecto xcode principal.

Hasta el momento, he creado una categoría de la class UIDevice en esta biblioteca. Cuando ejecuto el proyecto principal usando esta biblioteca se bloquea debido a un selector no reconocido

– [Plataforma UIDevice]: selector no reconocido enviado a instancia

La plataforma es una de las fuinctions que agregué a través de la categoría.

Así que pensé que no estaba vinculando esas funciones en absoluto y agregué la function ac al mismo file que la categoría UIDevice y luego la llamé desde mi código.

Esta vez el proyecto principal funcionó bien … Entonces pensé que tal vez era otra cosa que hice y eliminé la function C. Pero he aquí que se bloqueó nuevamente debido a un selector no reconocido.

Mis preguntas: ¿Por qué xcode ignora la definición de categoría a less que llame a una function declarada en el mismo file?

¿Existe una configuration de código x que pueda cambiar para que incluya estos methods de la categoría UIDevice independientemente de si invoco una function de ese file o no?

aclamaciones

Echa un vistazo a las bibliotecas estáticas Building Objective-C con categorías :

Objective-C no define los símbolos del linker para cada function (o método, en Objective-C); en cambio, los símbolos del linker solo se generan para cada class. Si extiende una class preexistente con categorías, el linker no sabe asociar el código object de la implementación de la class núcleo y la implementación de la categoría. Esto evita que los objects creados en la aplicación resultante respondan a un selector definido en la categoría.

Para resolver este problema, el enlace de destino contra la biblioteca estática debe pasar la opción -ObjC al linker. Este indicador hace que el linker cargue cada file de object en la biblioteca que define una class o categoría de Objective-C. Si bien esta opción generalmente dará como resultado un ejecutable más grande (debido al código de object adicional cargado en la aplicación), permitirá la creación exitosa de bibliotecas estáticas Objective-C eficaces que contienen categorías en classs existentes.


Importante : para aplicaciones de SO de 64 bits y iPhone, existe un error de linker que impide que -ObjC cargue files de objects de bibliotecas estáticas que solo contienen categorías y no tienen classs. La solución consiste en usar las banderas -all_load o -force_load.

Fuente: @albertamg ( vinculación de categorías objective-c en una biblioteca estática )

He tenido el mismo problema. Un método definido en una categoría definida en un subproyecto resultó en una exception de selector no reconocida. (De hecho, esto se manifestó como la incapacidad de especificar una subclass UILabel en Interface Builder; el XIB contenía la class que se muestra en IB (UILabel o UIView, según lo que arrastré allí), en lugar de la class que he tipeado y que se veía como un extraño error XCode).

La solución que funcionó para mí ha sido usar -force_load:

En el panel izquierdo, select su proyecto principal (el elemento raíz). A la derecha, verás PROJECT y TARGETS . Seleccione TARGETS . Vaya a "Configuración de compilation" (en la barra superior) – "Vinculación" – "Otros indicadores de linker" y, suponiendo que su subproyecto se llama XXXXX, agregue -force_load ${BUILT_PRODUCTS_DIR}/libXXXXX.a allí (el elemento tiene dos subitems, Depurar y Liberar, pero hace clic en este elemento compuesto para que si afecta a Depurar y Liberar).

Tenga en count que -force_load funciona para una sola biblioteca, y es posible que tenga que especificar una -force_load por separado para cada biblioteca de subproyecto.

Tuve este problema y pasé cerca de 1 hora para resolverlo. ¡Gracias a Dios! Se ha hecho. ¡Los methods que se definen deberían ser de tipo estático!