2011-09-05 1 views
5

Ho provato a verificare l'occorrenza di una sottostringa in una NSString in due modi, entrambi si sono bloccati. Questo è un oggetto NSString che ottengo da una delle proprietà di NSManagedObject.Verificare la sottostringa di NSString che si interrompe

  1. Utilizzando NSRange

    NSString *searchString = @"drive";

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

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

  2. Utilizzando NSScanner

    NSScanner *scanner = [NSScanner scannerWithString:text];

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

Entrambi funzionano quando text = @ "drive" ma causano arresti anomali di EXC_BAD_ACCESS quando il testo è "I drive" o "drive to". Non succede nulla se il testo è "idrive" o "driveto".

Anche estraneo, a volte gli esempi generano NSInvalidArgumentExceptions, dicendo che ho provato a passare un oggetto NSCFSet o DateComponents a rangeOfString :, nessuno dei quali uso nella mia app.

Qualche idea?

+0

Che cos'è il testo? Cosa contiene? –

+0

Quale chiamata al metodo si arresta? Come viene creato il testo? La mia scommessa è che il testo è finito e non più valido. – zaph

+0

@JeremyP Penso che stia succedendo sto ottenendo l'attributo di stringa dal mio NSManagedObject, in questo modo: text = managedObject.text; quindi sto cancellando managedObject. Quindi ho ragione nel dire che il testo non contiene una stringa, contiene un puntatore a managedObject.text, che non esiste più? – ntesler

risposta

5

Se a volte si ottiene EXC_BAD_ACCESS e, talvolta, il messaggio "oggetto-di-tipo-you-weren't attesa non risponde al metodo " le probabilità sono voi non sono mantenendo l'oggetto abbastanza a lungo e si sta scontando prima di arrivare dove lo usi.

Se la memoria non è stata riutilizzata quando ci si arriva, le cose sembreranno funzionare. Se lo spazio è stato riutilizzato per un altro oggetto e si allinea perfettamente allo stesso puntatore, otterrai qualcosa come "x non risponde al selettore". Se è sovrascritto in modo tale che il puntatore non punta a un oggetto valido, riceverai EXC_BAD_ACCESS

+0

Ah che ha perfettamente senso. Grazie! Vorrei poterti votare, ma non ho alcuna reputazione. – ntesler

+0

@ntesler: Grazie. La risposta accettata vale comunque 15 rep. – JeremyP

5

Il seguente ha funzionato perfettamente per me compresi gli spazi.

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

E se si vuole che sia case insensitive, solo convertire sia la stringa e la stringa di ricerca in minuscolo. Dovresti sapere come farlo immagino.

+1

Quel codice non sta facendo la stessa cosa. – zaph