【问题标题】:Grab the last x objects from an NSMutableArray从 NSMutableArray 中获取最后 x 个对象
【发布时间】:2013-03-13 20:02:33
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c cocoa nsarray


    【解决方案1】:

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

    为避免这种情况,只需使用 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)];
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 当我这样做时,我收到以下错误:2013-03-13 15:48:27.112 [38764:303] *** -[NSArray subarrayWithRange:]: range {86699, 86702} extends超出范围 [0 .. 86702] 范围似乎可行,但仍然返回超出范围。
      • 我想通了。我误解了范围的第二个值是第一个值的增量值,以下工作: NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(LogLines.count - 5, 4)] mutableCopy];
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多