2013-03-13 7 views
7

Sto provando ad afferrare gli ultimi x numeri di oggetti in un array e memorizzarli in un altro array.Raccogli gli ultimi x oggetti da un NSMutableArray

come non funziona:

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(0, [LogLines count])] mutableCopy]; 

Tuttavia questo non lo fa:

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), [LogLines count])] mutableCopy]; 

e il seguente errore si presenta nel registro:

2013-03-13 15:00 : 43.475 [38565: 303] * - [NARarray subarrayWithRange:]: range {83255, 83259} estende oltre i limiti [0 .. 83258]

Tuttavia la gamma sembra che dovrebbe rientrare nei limiti quindi non sono sicuro del motivo per cui sta dando questo errore.

risposta

2

Anche il primo non dovrebbe funzionare. Gli array sono a base zero, quindi chiamare il metodo count di un array restituirà sempre un valore in più rispetto all'ultimo indice utilizzato. Se si modifica il codice in

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), 4)] mutableCopy]; 

dovrebbe funzionare. Non sono sicuro del perché la prima linea funzioni, comunque.

+0

Quando faccio che ottengo il seguente errore: 2013/03/13 15: 48: 27,112 [ 38764: 303] *** - [NSArray subarrayWithRange:]: range {86699, 86702} estende oltre i limiti [0 .. 86702] L'intervallo sembra vitale, ma restituisce ancora oltre i limiti. – Prognastat

+0

L'ho capito. Ho frainteso che il secondo valore nell'intervallo è un valore incrementale dal primo valore, i seguenti lavori: NSMutableArray * LastLines = [[LogLines subarrayWithRange: NSMakeRange (LogLines.count - 5, 4)] mutableCopy]; – Prognastat

0

Se, ad esempio, l'array dispone di 10 elementi, count porta alla posizione 10. Come tale matrice inizia dalla posizione zero e si estende alla posizione 9, la posizione 10 sarà 1 oltre i limiti.

Prendere una distanza dal conteggio per ottenere l'ultima posizione:

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), [LogLines count]-1)] mutableCopy]; 
3

È possibile utilizzare NSArray -subarrayWithRange: Metodo altre risposte hanno suggerito, MA attenzione se l'intervallo supera il conteggio array (ad esempio, ricevendo lo scorso 10 linea mentre array contiene solo 4 elementi), genererà un'eccezione!

Per evitare ciò, è sufficiente utilizzare un if per controllare il conteggio prima l'array ...

NSArray *logs = <some long array> 
int lastLogsCount = 100; 
if (logs.count > lastLogsCount) { // check count first to avoid exception 
    logs = [logs subarrayWithRange:NSMakeRange(logs.count - lastLogsCount, lastLogsCount)]; 
}