作为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(?)为什么它不同?
答案 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
的第二次赋值会更改现有指针的值,而不是创建具有相同名称的第二个指针。