2012-03-15 11 views
15

noobie question .. Qual è il modo migliore per verificare se esiste l'indice di un array NSArray o NSMutableArray. Cerco dappertutto inutilmente !!Controllo NSAray fuori limite

Questo è quello che ho provato:

if (sections = [arr objectAtIndex:4]) 
{ 
    /*.....*/ 
} 

o

sections = [arr objectAtIndex:4] 
if (sections == nil) 
{ 
    /*.....*/ 
} 

ma entrambi i tiri un errore "fuori limite" non mi permette di continuare

(non rispondere con un tentativo di cattura perché non è una soluzione per me)

Grazie in anticipo

risposta

14
if (array.count > 4) { 
    sections = [array objectAtIndex:4]; 
} 
+1

Dannazione .. im così stupido .. ovviamente !! un array viene riempito in sequenza. mi sono fatto un casino Grazie amico +1 – spacebiker

+3

Penso che il linguaggio dell'obiettivo-c sia un po 'stupido qui. Sarei più a mio agio se '[array objectAtIndex: outOfBounds]' restituisse 'nil' invece di andare in crash. – turingtested

0

Tenete a mente NSArray è in ordine sequenziale da 0 a N-1 articoli

vostro stanno cercando di accessitem che ha superato il limite di e array è nil poi compilatore buttare via bound error.

EDIT: la risposta di @ sch sopra mostra come possiamo verificare se NSArray ha richiesto l'elemento ordinato presente o no.

+0

Un array di N elementi è in ordine sequenziale da 0 a N-1 – tothemario

+0

@tothemario: cattura meravigliosa. Grazie –

2

Se si dispone di un indice intero (ad esempio i), si può generalmente evitare che questo errore verificando le matrici limiti come questo

int indexForObjectInArray = 4; 
NSArray yourArray = ... 

if (indexForObjectInArray < [yourArray count]) 
{ 
    id objectOfArray = [yourArray objectAtIndex:indexForObjectInArray]; 
} 
0

È possibile utilizzare l'operatore MIN a fallire in silenzio come questo [array objectAtIndex:MIN(i, array.count-1)], a uno ottenere l'oggetto successivo nell'array o l'ultimo. Può essere utile quando si desidera, ad esempio per concatenare le stringhe:

NSArray *array = @[@"Some", @"random", @"array", @"of", @"strings", @"."]; 
NSString *concatenatedString = @""; 
for (NSUInteger i=0; i<10; i++) { //this would normally lead to crash 
    NSString *nextString = [[array objectAtIndex:MIN(i, array.count-1)]stringByAppendingString:@" "]; 
    concatenatedString = [concatenatedString stringByAppendingString:nextString]; 
    } 
NSLog(@"%@", concatenatedString); 

Risultato: "Alcuni serie casuale di stringhe....."