从NSMutableArray中获取最后的x个对象

时间:2013-03-13 20:02:34

标签: objective-c cocoa nsarray

我正在尝试获取数组中最后x个对象的数量并将其存储在另一个数组中。

像这样有效:

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

然而,这不是:

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

并在日志中显示以下错误:

2013-03-13 15:00:43.475 [38565:303] * - [NSArray subarrayWithRange:]:范围{83255,83259}超出边界[0 .. 83258]

然而,范围似乎应该在范围内,所以我不确定为什么会出现这个错误。

3 个答案:

答案 0 :(得分:4)

You can use NSArray -subarrayWithRange: method as other answers suggested, BUT beware if the range exceeds the array count (e.g. getting last 10 line while array only contains 4 elements), it will raise an exception!

To avoid this, simply use an if to check the array count first...

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)];
}

答案 1 :(得分:2)

第一个也不应该工作。数组是从零开始的,因此调用数组的count方法将始终返回比最后使用的索引多一个的方法。如果您将代码更改为

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

它应该有用。我不知道为什么第一行确实有效。

答案 2 :(得分:0)

例如,如果您的数组有10个项目,count会将您带到位置10.这样的数组从位置0开始并延伸到位置9,位置10将超出边界1。

从计数中抽出一个来获得最后一个位置:

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