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 回答
0

删除你的自动释放!为我工作很好!

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

2013-10-16 14:29:35.537 注释[566:c07] strArray = ( 2, 3, 5 )

于 2013-10-16T11:33:51.307 回答