NSInteger считает раз 4?

Я не понимаю, почему этот счетчик NSInteger увеличивает ровно в 4 раза истинное значение строк базы данных. Может быть, это глупо, но я просто не понимаю...

Пока спасибо:)

NSInteger *i;
i = 0;

for ( NSDictionary *teil in gText ) {

    //NSLog(@"%@", [teil valueForKey:@"Inhalt"]);

    [databaseWrapper addEntry:[teil valueForKey:@"Inhalt"] withTyp:[teil valueForKey:@"Typ"] withParagraph:[teil valueForKey:@"Paragraph"]];

    i+=1;
}

NSLog(@"Number of rows created: %d", i);

2 ответа

Решение

Потому что я указатель, а вы увеличиваете значение указателя, которое, скорее всего, будет с шагом 4 (размер указателя NSInteger). Просто удалите указатель * ссылка, и все будет хорошо.

NSInteger i = 0;

for ( NSDictionary *teil in gText ) {

Теоретически вы МОЖЕТЕ сделать это трудным путем.

NSInteger *i;
*i = 0;
for ( NSDictionary *teil in gText ) {
...
*i = *i + 1;
...

От: Справочник типов данных фонда

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

i не объявлен как NSInteger, он объявлен как указатель на NSInteger,

С NSInteger 4 байта, когда вы добавляете 1, указатель фактически увеличивается на 1 NSIntegerили 4 байта.

i = 0;
...
i += 1; //Actually adds 4, since sizeof(NSInteger) == 4
...
NSLog(@"%d", i); //Prints 4

Эта путаница возникает потому, что NSInteger не является объектом, поэтому вам не нужно объявлять указатель на него. Измените ваше объявление на это для ожидаемого поведения:

NSInteger i = 0;
Другие вопросы по тегам