9

我正在尝试获取数组中最后 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]

但是范围似乎应该在范围内,所以我不确定它为什么会给出这个错误。

4

3 回答 3

6

您可以使用NSArray -subarrayWithRange:其他答案建议的方法,请注意如果范围超出数组计数(例如,在数组仅包含 4 个元素时获取最后 10 行),它将引发异常!

为避免这种情况,只需if先使用 an 检查数组计数...

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)];
}
于 2015-07-28T17:12:11.647 回答
2

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

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

它应该工作。不过,我不确定为什么第一行确实有效。

于 2013-03-13T20:11:58.403 回答
0

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

从 count 中取一个得到最后一个位置:

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), [LogLines count]-1)] mutableCopy];
于 2013-03-13T20:14:33.857 回答