2013-12-03 2 views
2

Как новичка 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; 

В обоих случаях я do redefine * newNumber (?) Почему это другое?

ответ

1

Objective-C только позволяет объявить тип локальной переменной в пределах области действия. Таким образом, следующие в порядке:

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

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

В этом случае второе назначение newNumber изменяет значение существующего указателя, а не создавать второй указатель с тем же именем.

+0

Я бы сказал, что Objective-C (как и большинство языков) позволяет объявлять переменную только в пределах области. Тип не имеет значения. В вашем ответе второе использование 'newNumber' не является объявлением. – rmaddy

+0

Да, конечно, большинство языков, основанных на масштабах, следуют аналогичному правилу. Я просто упомянул Objective-C специально, потому что об этом спрашивал OP. –

+0

Точка моего комментария, что вы указали »* Objective-C позволяет только объявить * тип * локальной переменной в пределах области. *. Я говорю, что этот тип не имеет значения. Утверждение должно быть просто «* Objective-C» позволяет только объявлять локальную переменную один раз в пределах области. * « – rmaddy

4

Имена переменных должны быть уникальными в пределах заданного объема.

Объем определяется фигурные скобки {}. Переменные действительны только в том объеме, в котором они определены (и в областях в пределах этой области).

Если у вас есть цикл, как

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

newNumber доступен только внутри, что цикл (между {}). После каждой итерации он «ушел».

Если у вас есть сферы, как

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

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

обе newNumber переменные находятся в той же области, и поэтому не уникальным.

+1

То же самое относится и к большинству других языков программирования, будь то Java, C++, C# или Ruby. – Sulthan

Смежные вопросы