2011-09-05 9 views
5

He intentado comprobar la existencia de una subcadena en un NSString de dos maneras, ambas se han bloqueado. Este es un objeto NSString que obtengo de una de las propiedades de mi NSManagedObject.Comprobar la subcadena de NSString estrellarse

  1. Usando NSRange

    NSString *searchString = @"drive";

    NSRange range = [text rangeOfString:searchString options:(NSCaseInsensitiveSearch)];

    if (range.location != NSNotFound) { NSLog(@"Found"); }

  2. Usando NSScanner

    NSScanner *scanner = [NSScanner scannerWithString:text];

    NSLog(@"%d",[scanner scanString:searchString intoString:nil]);

Ambos funcionan cuando text = @ "drive" pero causa EXC_BAD_ACCESS falla cuando el texto es "i drive", o "drive to". No ocurre nada si el texto es "idrive" o "driveto".

Aún más extraño, a veces los ejemplos lanzan NSInvalidArgumentExceptions, diciendo que traté de pasar un NSCFSet o un objeto DateComponents a rangeOfString: ninguno de los cuales uso en mi aplicación.

¿Alguna idea?

+0

¿Qué es el texto? ¿Qué contiene? –

+0

¿Qué método de llamada se bloquea? ¿Cómo se crea el texto? Mi apuesta es que el texto está sobre lanzado y ya no es válido. – zaph

+0

@JeremyP Creo que lo que está sucediendo es que obtengo el atributo de cadena de mi NSManagedObject, así: text = managedObject.text; luego eliminaré ManageObject. Entonces, ¿tengo razón al decir que el texto no contiene una cadena, contiene un puntero a managedObject.text, que ya no existe? – ntesler

Respuesta

5

Si a veces se obtiene EXC_BAD_ACCESS y, a veces el mensaje "rubros de tipo-que-weren't esperando no responde al método " Lo más probable es que no son el objeto de retención durante el tiempo suficiente y se desasigna antes de llegar a donde lo usa.

Si la memoria no se ha reutilizado cuando llega, las cosas parecerán funcionar. Si el espacio se ha reutilizado para otro objeto y se alinea perfectamente, es decir, el mismo puntero, obtendrá algo como "x no responde al selector". Si se sobrescribe de tal manera que el puntero no apunte a un objeto válido, obtendrá EXC_BAD_ACCESS

+0

Ah, eso tiene perfecto sentido. ¡Gracias! Ojalá pudiera votarte pero no tengo reputación. – ntesler

+0

@ntesler: Gracias. La respuesta aceptada vale 15 rep de todos modos. – JeremyP

5

Lo siguiente funcionó perfectamente para mí, incluidos los espacios.

NSString *string = @"hello one two three"; 
if ([string rangeOfString:@"one two"].location == NSNotFound) { 
    NSLog(@"string does not contain substring"); 
} else { 
    NSLog(@"string contains substring!"); 
} 

Y si usted quiere que sea sensible a mayúsculas, simplemente convertir tanto la cadena y la cadena de búsqueda en minúsculas. Deberías saber cómo hacer eso, supongo.

+1

Ese código no está haciendo lo mismo. – zaph

Cuestiones relacionadas