ios xcode linker categories

ios - vincular categorías objetivo-c en una biblioteca estática



xcode linker (3)

Consulte las bibliotecas estáticas Building Objective-C con categorías :

Objective-C no define los símbolos del enlazador para cada función (o método, en Objective-C); en su lugar, los símbolos del enlazador solo se generan para cada clase. Si amplía una clase preexistente con categorías, el vinculador no sabe asociar el código objeto de la implementación de la clase principal y la implementación de la categoría. Esto evita que los objetos creados en la aplicación resultante respondan a un selector que está 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 vinculador. Este indicador hace que el enlazador cargue cada archivo de objeto en la biblioteca que define una clase o categoría Objective-C. Si bien esta opción generalmente dará como resultado un archivo ejecutable más grande (debido a un código de objeto adicional cargado en la aplicación), permitirá la creación exitosa de bibliotecas estáticas efectivas Objective-C que contienen categorías en las clases existentes.

Importante : Para las aplicaciones de sistema operativo de 64 bits e iPhone, hay un error del enlazador que impide que''ObjC cargue archivos de objetos de librerías estáticas que contienen solo categorías y sin clases. La solución alternativa es usar los indicadores -all_load o -force_load.

Fuente: @albertamg ( vincular categorías objetivo-c en una biblioteca estática )

Estoy desarrollando un complemento para una aplicación iOS. Lo estoy compilando en un archivo .a que luego es utilizado por el proyecto principal de xcode.

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

- [Plataforma de UIDevice]: selector no reconocido enviado a la instancia

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

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

Esta vez el proyecto principal funcionó bien ... Así que pensé que tal vez era algo más lo que hice y eliminé la función C. Pero he aquí que se estrelló de nuevo debido a un selector no reconocido ...

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

¿Existe una configuración de xcode que pueda cambiar para que incluya estos métodos desde la categoría UIDevice independientemente de si invoco una función desde ese archivo o no?

aclamaciones


He tenido el mismo problema. Un método definido en una categoría definida en un subproyecto resultó en una excepción de selector no reconocido. (De hecho, esto se manifestó como la imposibilidad de especificar una subclase UILabel en Interface Builder; el XIB contenía la clase mostrada en IB (UILabel o UIView, dependiendo de lo que arrastré allí), en lugar de la clase que he escrito, y que parecía un raro error de XCode).

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

En el panel de la izquierda, selecciona tu proyecto principal (el elemento raíz). A la derecha, verá PROJECT y TARGETS . Seleccione TARGETS . Vaya a "Configuraciones de compilación" (en la barra superior) - "Vinculando" - "Otras banderas enlazadoras" y, suponiendo que su subproyecto se llame XXXXX, agregue -force_load ${BUILT_PRODUCTS_DIR}/libXXXXX.a allí (el elemento tiene dos subitems, Debug and Release, pero haga clic en este elemento compuesto para que afecte tanto a Debug como a Release).

Tenga en cuenta que -force_load funciona para una única biblioteca, y es posible que deba especificar una carga de fuerza independiente para cada biblioteca de subproyecto.


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