2012-09-10 17 views
10

Tengo una clase de categoría NSString (NSString+URLEncoding.h). Me estoy encontrando con un bloqueo del selector desconocido, porque la cadena que estoy llamando el método de categoría se ha optimizado en un NSCFConstantString por iOS.iOS 5: ¿la categoría Make NSString incluye NSCFConstantString?

-[__NSCFConstantString URLEncodedString]: unrecognized selector sent to instance 0x290174 

supe de la NSCFConstantString vs NSCFString optimizaciones en IOS 5 a partir de: http://www.cocoanetics.com/2012/03/beware-of-nsstring-optimizations/

Hay alguien consciente de lo que puedo conseguir la categoría NSString para incluir las cadenas constantes o incluso forzar al ser var un NSString/NSCFString y no un NSCFConstantString?

Cheers, Z

banderas

operación -Editar-

  • Linker -ObjC -all_load son ambos ya implementados
  • NSString + URLEncoding.m está incluido en los objetivos compilar fuentes
  • NSString + URLEncoding. m implementa el método URLEncodedString.
  • Chequeado para zombies.

añado un servicio de intercambio de ShareKit 2.0

cabecera:

@interface NSString (OAURLEncodingAdditions) 

- (NSString *)URLEncodedString; 

aplicación:

@implementation NSString (OAURLEncodingAdditions) 

- (NSString *)URLEncodedString 
{ 
    NSString *result = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                      (CFStringRef)self, 
                      NULL, 
                      CFSTR("!*'();:@&=+$,/?%#[]"), 
                      kCFStringEncodingUTF8); 
    [result autorelease]; 
    return result; 
} 
+0

¿está resuelto? si no es así, ¿puedo intentar resolverlo si lo necesita? –

+0

La cosa '__NSCFConstantString' en el blog que vinculó es una pista falsa.El problema en el blog no tiene nada que ver con la creación de subclases y todo tiene que ver con el hecho de que Apple intenta optimizar todas las cadenas vacías para un objeto. Si el único objeto que representa una cadena vacía es un simple 'NSString', el código del blog aún se romperá. – JeremyP

Respuesta

11

Existe un problema con el vinculador que puede hacer que su extracción de código muerto omita por completo cualquier archivo de objeto que solo contenga categorías obj-c (o que no tengan referencias). Teóricamente, pasar el indicador -ObjC al enlazador debería solucionarlo, pero eso no parece funcionar siempre. Puede solucionar este problema proporcionando el indicador de enlazador -all_load, que hará que el vinculador siempre enlace en todos los archivos de objeto.

Tenga en cuenta que puede tener que establecer -all_load en el proyecto principal si su categoría es parte de un subproyecto o biblioteca que usted está incluyendo en alguna parte.

+0

editado, ¿podría echar un vistazo otra vez? –

+0

Exactamente, esto funciona para mí. Gracias ... :) –

2

__NSCFConstantString es una subclase de NSString, por lo que cualquier categorías en NSString aplican a __NSCFConstantString también.

O bien no está vinculando en su categoría, o su categoría no define un método URLEncodedString en su @implementation.

+0

editado, ¿podría echar un vistazo otra vez? –

4

Acabo de pasar 30 minutos descubriendo exactamente el mismo problema. Después de jugar con el enlazador, descubrí que la categoría no estaba presente en Compilar fuentes lista en Build Fases de mi objetivo. Asegúrate de comprobar que está allí.

+0

Especialmente cuando tiene objetivos múltiples, si olvida agregar un nuevo archivo agregado a varios destinos, podría causar este problema. – UnchartedWorks