NSInteger считает раз 4? - PullRequest
       49

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

5 голосов
/ 23 марта 2011

Я не понимаю, почему этот счетчик 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 ]

11 голосов
/ 23 марта 2011

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

NSInteger i = 0;

for ( NSDictionary *teil in gText ) {

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

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

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

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
#else
typedef int NSInteger;
#endif
1 голос
/ 23 марта 2011

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;
...