今天发生了一件奇怪的事。
我有一个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>"
)
为什么发生这种情况? 我期待同样的行为。
答案 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处的项目被替换为“新的”。