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

Pro*_*tat 8 cocoa objective-c nsarray

我试图抓取数组中的最后x个对象并将其存储在另一个数组中.

像这样工作:

    NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(0, [LogLines count])] mutableCopy];
Run Code Online (Sandbox Code Playgroud)

但是,这不是:

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), [LogLines count])] mutableCopy];
Run Code Online (Sandbox Code Playgroud)

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

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

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

Hlu*_*ung 6

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

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

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)];
}
Run Code Online (Sandbox Code Playgroud)


Sco*_*ets 2

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

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), 4)] mutableCopy];
Run Code Online (Sandbox Code Playgroud)

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