2013-03-13 74 views
7

我想抓住數組中的最後x個對象並將其存儲在另一個數組中。從NSMutableArray獲取最後的x個對象

喜歡這個工作:

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

儘管如此,這並不:

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

,並在日誌中出現以下錯誤顯示出來:

2013年3月13日15:00 :43.475 [38565:303] * - [NSArray subarrayWithRange:]:range {83255,83259} extend bound bound [0 .. 83258]

但是,範圍似乎應該落在界限內,所以我不確定它爲什麼會給出這個錯誤。

回答

2

第一個也不應該工作。數組從零開始,因此調用數組的count方法總是會返回比最後使用的索引多一個的方法。如果您將代碼更改爲

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

它應該工作。不過,我不確定爲什麼第一行確實有效。

+0

當我這樣做,我得到以下錯誤: 2013年3月13日15:48:27.112 [ 38764:303] *** - [NSArray subarrayWithRange:]:範圍{86699,86702}延伸超出界限[0 .. 86702] 範圍似乎可行,但仍然返回超出界限。 – Prognastat 2013-03-13 20:48:50

+0

我想通了。我誤解了範圍上的第二個值是從第一個值開始的增量值,以下工作: NSMutableArray * LastLines = [[LogLines subarrayWithRange:NSMakeRange(LogLines.count - 5,4)] mutableCopy]; – Prognastat 2013-03-13 21:03:07

0

例如,如果您的數組有10個項目,則count會將您帶到第10個位置。由於這樣的數組從第零位開始並延伸到位置9,位置10將超出界限1。

採取一個遠離計數,以獲得最後的位置:

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

您可以使用NSArray -subarrayWithRange:方法,其他的答案表明,如果範圍超出了數組數提防(如獲得最後的10線,而數組只包含4個元素),它會引發異常!

爲了避免這種情況,只需使用if檢查數組先算......

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)]; 
} 
相關問題