2013-04-23 3 views
1

Я новичок в Objective-C и, вероятно, очень легко решить, но не смог найти ответ везде ....Добавление +1 к переменному по нажатию кнопки добавления неправильного номера

Я пытаюсь добавить +1 к переменной каждый раз, когда пользователь нажимает на кнопку, но вместо добавления +1 добавляет +4

- (IBAction)addNewSet:(UIButton *)sender { 
    NSLog(@"%i",_sliderTag); 
    _sliderTag += 1; 
    NSLog(@"ADD NEW %i",_sliderTag); 
} 

_sliderTag это уже NSInteger:

@property (nonatomic,assign) NSInteger* sliderTag; 

Первые NSLog отпечатки 0 и 2-й после добавления выполняется отпечатки 4. Может ли кто-нибудь объяснить, почему? Он предназначен для печати 0 первого, поскольку точкой этой переменной является счетчик для установки тегов.

+0

Поскольку вы указали sliderTag как указатель, а не int. Даже не нужно было смотреть на объявление своей собственности, чтобы сказать это. –

+0

Как говорили другие в своих ответах, вы используете указатель на 'NSInteger'. 'NSInteger' не является классом (как он указывает), а typedef для чего-то очень похожего на int. – HAS

+0

@HAS - Это не класс или нет, это то, является ли это указателем или нет. Когда вы увеличиваете указатель в C, вы увеличиваете размер элемента, на который указывает. Не следует использовать указатель, в котором предназначен int. –

ответ

6

Похоже, что _sliderTag является указателем на тип, размер которого составляет 4 байта. Добавление 1 к указателю увеличивает его на размер типа, на который указывает. Вот два примера, которые иллюстрируют разницу:

NSInteger foo = 0; 
foo += 1; 
NSLog(@"result: foo = %d", foo); // result: foo = 1 

NSInteger *bar = 0;     // note the '*' 
bar += 1; 
NSLog(@"result: bar = %d", bar); // result: bar = 4 
+0

_sliderTag уже является NSInteger –

+2

Это потому, что вы объявили его как указатель' NSInteger * ', удалите звезду. 'sizeof (* _ sliderTag)' в вашей системе 4, и увеличение указателя на 1 приводит к отпечатку адреса из 4. – Joe

+2

@JonathanThurft - sliderTag - это * не * NSInteger, это указатель на NSInteger. Совершенно другая вещь. (И разница, которую вы должны знать, прежде чем идти дальше, в программировании в Objective-C.) –

1

первый, убедитесь, что _sliderTag является INT или Integer или INT, а не Integer * или INT *, второй, то не печатать его с% I, но с% г

+0

Почему не печатать с% i? Когда вы печатаете, они делают то же самое, см. Этот вопрос SO: http://stackoverflow.com/questions/1893490/difference-between-format-specifiers-i-and-d-in-printf – HAS

+0

только что я использовал для так i написал его, чтобы убедиться, что он как на моем компьютере – Dima

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