2010-10-04 19 views
7

Tengo el siguiente código que produce este error. No puedo entender por qué el mensaje subarrayWithRange se está enviando a una cadena? Cuando es claramente una matriz?Selector no reconocido enviado a la instancia [NSCFString subarrayWithRange:]

static const int kItemsPerView = 20; 
NSRange rangeForView = NSMakeRange(page * kItemsPerView, kItemsPerView); 

NSMutableArray *temp = [[APP_DELEGATE keysArray] mutableCopyWithZone:NULL]; 
NSArray *itemsForView = [temp subarrayWithRange:rangeForView]; 

for (int loopCounter = 0;loopCounter < r*c;loopCounter++){ 
    NSLog(@"%i: %@ ", loopCounter, [itemsForView objectAtIndex:loopCounter]); 
} 

error:

-[NSCFString subarrayWithRange:]: unrecognized selector sent to instance 0x6b071a0 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: [NSCFString subarrayWithRange:]: 

Gracias

Respuesta

29

Este tipo de errores son por lo general la memoria de gestión relacionados. Esencialmente, está enviando un mensaje a una dirección que ahora está ocupada por otro objeto porque el ocupante anterior ha desaparecido inesperadamente. Como ese espacio de direcciones puede estar ocupado por cualquier cosa, simplemente le está preguntando a un NSCFString algo a lo que no responde.

Si pausa el depurador inmediatamente después de crear la matriz temporal, ¿qué ve asignado a la temperatura? Supongo que algo no está bien con lo que sea que devuelvakeysArray. Es posible que desee verificar dos veces cómo se maneja la memoria en lo que se supone que debe regresar. Por el nombre, supongo que su delegado de aplicación tiene una matriz llamada "keysArray" como una variable de instancia. Tal vez eso no se conserva correctamente cuando se crea o se asigna?

+0

Después de la creación, 'temp' es una matriz de 80 cuerdas, información sobre herramientas de depuración sólo muestra 10 artículos aunque no estoy seguro si eso es sólo Xcode o no? Estás en las teclas correctas. Array es una variable de instancia en mi delegado de aplicaciones, una propiedad definida como (no atómica, retener) y luego sintetizada y asignada mediante el método de conveniencia 'arrayWithContentsOfFile'. No necesito retenerlo manualmente, ¿verdad? – joec

+0

Sí. No lo creaste, el método de conveniencia lo hizo. Por lo tanto, si desea que se quede después de que se creó, debe replantear un reclamo reteniendo (o crear una copia propia). Eche otro vistazo a las reglas de administración de memoria. –

+0

Si usa el descriptor de acceso a la propiedad en lugar de asignarlo, entonces no necesitará retenerlo; o bien, puede llamar a '[[NSArray alloc] initWithContentsOfFile: @" somepath "]' en su lugar. – jlehr

4

Así que tuve esta. Hice algo estúpido. Le asigné el UITextView a una cadena en lugar de su propiedad de texto. es decir:

myObj.txtbxThing = [NSString stringWithFormat:@"%@", stuffString]; 

en lugar de:

myObj.txtbxThing.text = [NSString stringWithFormat:@"%@", stuffString]; 
+0

Hice algo similarmente estúpido. Asigné un NSString a un NSURL * y * de alguna manera me perdí la advertencia del compilador al respecto. –

Cuestiones relacionadas