0
NSString *str = @"1 2 3 4 5";
NSMutableArray *strArray = [[[str componentsSeparatedByString:@" "] mutableCopy] autorelease];
[strArray removeObjectAtIndex:3];
[strArray removeObjectAtIndex:0];

このコードの最後で、配列に @"2"、@"3"、@"5" が含まれていることを期待しています。

ただし、0x00000、@"2"、@"3" が含まれています。

修正方法は?数値は単なる例であり、スペースで区切られたさまざまな長さのさまざまな文字列が存在する可能性があります。

更新しました

奇妙ですが、実際には 2、3、5 がコンソールに書き込まれます。

しかし、これはデバッグ ウィンドウの同じ配列です。

ここに画像の説明を入力

4

4 に答える 4

2

あなたのコードがうまく機能しない理由がわからないので、以下の他の方法でも同じことを試しました:-

NSString *str = @"1 2 3 4 5";
NSArray *arr1= [str componentsSeparatedByString:@" "];
NSMutableArray *strArray=[NSMutableArray arrayWithArray:arr1];
[strArray removeObjectAtIndex:3];
[strArray removeObjectAtIndex:0];
NSLog(@"%@",strArray);

Output:-

2
3
5
于 2013-10-16T10:50:21.657 に答える
1

これが私が起こっていると思うことです。あなたが持っているのは、どちらかといえば、デバッガーのバグです。

NSMutableArray内部では通常の C 配列で表現されているとしましょう。の素朴な実装で-removeObjectAtIndex:は、削除したいオブジェクトの後のすべてのオブジェクトを配列の前のスロットにシャッフルします。これには O(n) の複雑さがあり、n は配列内のオブジェクトの数です。

最適化は、インデックスをパラメーターとして受け取るメソッドに提供されるインデックスから差し引かれる配列に「ベース インデックス」を関連付けることです。そう[foo removeObjectAtIndex: 0]すれば、最初の要素に nil を割り当て、一定の時間の複雑さのためにベースインデックスをバンプするだけで実装できます。

実際の実装はそれよりも複雑だと思いますが、上記は単にアイデアを説明するのに役立ちます.

デバッガーがこれを認識していない場合、質問のスクリーン キャップとまったく同じように、基礎となる C 配列が表示されます。ポイントは、オブジェクトの内部を知ることが期待できない場合、デバッガーを本当に信頼できないということです。-description説明をコンソールに出力することは、オブジェクトを検査するためのより信頼できる方法です -有用な実装がある限り。

于 2013-10-16T11:51:35.907 に答える
0

なぜ ARC を使用しないのですか? ARCを使用してそのコードをテストしましたが、動作します。それで、あなたがやろうとしていることをもう少し説明できますか?(コメントとして追加できませんでした)

于 2013-10-16T10:11:52.323 に答える