为什么NSMutableArray文字赋值无法正常工作?

时间:2014-02-14 13:20:04

标签: ios objective-c

今天发生了一件奇怪的事。

我有一个NSMutableArray数组

@property (nonatomic) NSMutableArray *draggedWords;

然后我将空值赋给数组(someElements有4个元素)

[someElements enumerateObjectsUsingBlock:^(CustomLabel *element, NSUInteger idx, BOOL *stop) {
    // ...
    self.draggedWords[idx] = [NSNull null];
}];

NSLog(@"%@", self.draggedWords);

然后在同一个控制器的另一个动作中,我确实替换了数组中的值(index == 0)

self.draggedWords[index] = self.draggableItem;
NSLog(@"%@", self.draggedWords);

结果其实很奇怪。它不是替换索引处的值,而是添加它:

2014-02-14 14:21:44.601 [39271:70b] (
    "<null>",
    "<null>",
    "<null>",
    "<null>"
)
2014-02-14 14:21:49.870 [39271:70b] (
    "<CustomLabel: 0x19156b40; baseClass = UILabel; frame = (374 0; 300 80); text = '...'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x191d0960>>",
    "<null>",
    "<null>",
    "<null>",
    "<null>"
)

如果我使用replaceObjectAtIndex,它会按预期工作

[array replaceObjectAtIndex:0 withObject:Object];

我得到了我的预期(4个元素)

2014-02-14 14:25:24.670 [39271:70b] (
    "<CustomLabel: 0x19156b40; baseClass = UILabel; frame = (374 0; 300 80); text = '...'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x191d0960>>",
    "<null>",
    "<null>",
    "<null>"
)

为什么发生这种情况? 我期待同样的行为。

2 个答案:

答案 0 :(得分:4)

最小测试用例:

NSMutableArray *foo = [NSMutableArray arrayWithObjects:[NSNull null], [NSNull null], [NSNull null], [NSNull null], nil];
NSLog(@"%@", foo);
foo[0] = @"bar";
NSLog(@"%@", foo);

输出:

2014-02-14 14:27:15.083 test[6642:70b] (
    "<null>",
    "<null>",
    "<null>",
    "<null>"
)
2014-02-14 14:27:15.084 test[6642:70b] (
    bar,
    "<null>",
    "<null>",
    "<null>"
)

因此,您所描述的行为并非来自Cocoa。请出示您的代码。

修改

同样,不可能用你所提供的内容重现问题:

NSArray *someElements = @[@1, @2, @3, @4];

NSMutableArray *draggedWords = [NSMutableArray array];
NSLog(@"%@", draggedWords);
[someElements enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    draggedWords[idx] = [NSNull null];
}];

NSLog(@"%@", draggedWords);

draggedWords[0] = @"bar";
NSLog(@"%@", draggedWords);

输出:

2014-02-14 17:03:07.427 test[15380:70b] (
)
2014-02-14 17:03:07.429 test[15380:70b] (
    "<null>",
    "<null>",
    "<null>",
    "<null>"
)
2014-02-14 17:03:07.429 test[15380:70b] (
    bar,
    "<null>",
    "<null>",
    "<null>"
)

代码的其他部分出了问题。尝试通过逐位注释代码来确定哪个部分为您提供了这个奇怪的输出,直到错误消失。

答案 1 :(得分:0)

你以某种方式感到困惑。这段代码:

NSMutableArray *array = [NSMutableArray arrayWithObjects: @"zero", @"one", @"two", @"three", nil];
array[0] = @"new one";
NSLog(@"array = %@", array);

给出了这个结果:

array = (
    "new one",
    one,
    two,
    three
)

这清楚地表明索引0处的项目被替换为“新的”。