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

最初のものも機能しないはずです。配列は 0 から始まるため、配列のcountメソッドを呼び出すと、最後に使用されたインデックスより常に 1 つ多いインデックスが返されます。コードを次のように変更すると

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 から 1 を引いて最後の位置を取得します。

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