通过循环创建具有相同名称的新实例

时间:2013-12-03 22:22:47

标签: objective-c

作为Objective C的新手,我无法理解为什么会这样:

@autoreleasepool {
    for (int i = 0; i<10; i++) {
        NSNumber *newNumber = [[NSNumber alloc] initWithInt:(i)];
        NSLog(@"New number = %@", newNumber);
    }
}
return 0;

但不是这样:

@autoreleasepool {
    NSNumber *newNumber = [[NSNumber alloc] initWithInt:(0)];
    NSLog(@"New number = %@", newNumber);

    NSNumber *newNumber = [[NSNumber alloc] initWithInt:(1)];
    NSLog(@"New number = %@", newNumber);
}
return 0;

在这两种情况下,我都重新定义* newNumber(?)为什么它不同?

2 个答案:

答案 0 :(得分:4)

变量名在给定范围内必须是唯一的。

范围由花括号{}定义。变量仅在它们定义的范围内(以及在该范围内的范围内)有效。

如果你有像

这样的循环
for (int i = 0; i < 10; i++) {
    NSNumber *newNumber = [[NSNumber alloc] initWithInt:(i)];
    NSLog(@"New number = %@", newNumber);
}

newNumber仅在for循环内可用(在{}之间)。每次迭代后它都会“消失”。

如果您有像

这样的范围
@autoreleasepool {
    NSNumber *newNumber = [[NSNumber alloc] initWithInt:(0)];
    NSLog(@"New number = %@", newNumber);

    NSNumber *newNumber = [[NSNumber alloc] initWithInt:(1)];
    NSLog(@"New number = %@", newNumber);
}

两个newNumber变量都在同一范围内,因此唯一。

答案 1 :(得分:1)

Objective-C只允许您在范围内声明一次局部变量的类型。所以以下情况很好:

@autoreleasepool {
    NSNumber *newNumber = [[NSNumber alloc] initWithInt:(0)];
    NSLog(@"New number = %@", newNumber);

    newNumber = [[NSNumber alloc] initWithInt:(1)];
    NSLog(@"New number = %@", newNumber);
}

在这种情况下,对newNumber的第二次赋值会更改现有指针的值,而不是创建具有相同名称的第二个指针。