NSNumber LoopVar ++ для цикла с шагом 4 вместо 1 - PullRequest
0 голосов
/ 24 декабря 2010

Я совершенно уверен, что на этот вопрос есть очень простой ответ, который я должен был выяснить к настоящему времени.Так как я еще не сделал этого, я прихожу к вам, подумайте о переполнении стека.

Я ожидал, что в цикле ниже будут распечатываться числа от 0 до 5. Вместо этого он печатает только 0 и 4. ПочемуLoopNumber ++ увеличивает мой номер NSNumber LoopNumber на 4 вместо 1?

NSNumber *LoopNumber;
for (LoopNumber=0; LoopNumber<=5; LoopNumber++) {
    NSLog(@"%d",LoopNumber);
}

Если я изменю это на следующее, оно будет работать точно так, как я ожидаю.Что дает?

for (int LoopNumber=0; LoopNumber<=5; LoopNumber++) {

Я дурачусь с проектом iPhone в XCode 3.2.1, используя SDK 3.1.2.

Ответы [ 2 ]

4 голосов
/ 24 декабря 2010

NSNumber не является целым числом.Это обертка объекта для числа, которое может быть целым числом.

Переменная LoopNumber фактически является указателем на место в памяти, где должен находиться объект.Все, что содержит LoopNumber - это адрес памяти, который на вашей машине имеет длину 4 байта.Когда вы делаете LoopNumber ++, вы вводите указатель в арифметику с указателем, и он переходит к следующему адресу памяти, который составляет четыре байта позже.Вы можете увидеть это, выполнив sizeof (LoopNumber), который в вашей системе вернет 4.

Что вы действительно хотите сделать, так это использовать обычное целое число, например:

NSUInteger loopNumber;
for(loopNumber = 0; loopNumber <= 5; loopNumber++) {
  NSLog(@"%d",loopnumber);
}

если вам действительно нужно использовать NSNumbers:

NSNumber loopNumber;
for(loopNumber = [NSNumber numberWithInt:0]; [loopNumber intValue] <= 5; loopNumber=[NSNumber numberWithInt:[loopNumber intValue]++]) {
  NSLog(@"%d",loopnumber);
}
0 голосов
/ 24 декабря 2010

int является нативным типом. NSNumber - это класс Objective-C. Используйте float или int при выполнении реальной работы. Но чтобы поместить int в коллекцию, вы можете создать объект NSNumber из собственного типа int или float.

...