Objective-C обрабатывает целочисленные значения

Меня смущает, как обрабатывать целые числа в Objective C.

Если я определяю следующее:

NSInteger i = 6;
NSLog(@"%d", i);

Я ожидаю, что он напечатает 6 на консоли.

однако у меня есть NSInteger внутри объекта, на который явно ссылается указатель, поэтому я получаю очень разные результаты.

Например:

@interface Section : NSObject {
NSInteger Id;
}

@property (nonatomic, assign) NSInteger Id;

Пожалуйста, предположим, что это было синтезировано в реализации.

Я создаю объект, устанавливаю его значение и снова получаю к нему доступ следующим образом:

Section *section = [[Section alloc] init];
section.Id = 6;

NSMutableArray *sections = [[NSMutableArray alloc] init];
[sections addobject:section];

Section *sectionB = [setions objectAtIndex:0];
NSLog(@"%d",  sectionB.Id);

Это имеет странный эффект печати адреса памяти, т.е. числа вроде 5447889. Почему я не могу просто получить значение?

Я пробовал использовать:

NSInteger sid = [[section Id]integerValue];

Но затем я получаю предупреждение Неверный тип приемника 'NSInteger' и иногда получаю сообщение об ошибке Программа получила сигнал: «EXC_BAD_ACCESS».

Мне бы очень хотелось знать, как правильно обрабатывать целые числа или любые значения в этом отношении.

Огромное спасибо


person Chris    schedule 13.10.2010    source источник


Ответы (3)


Похоже, вы обращаетесь к неинициализированной памяти; 5447889 не выглядит как значение указателя — указатели обычно выравниваются по слову, а 5447889 не выравнивается по слову.

Может быть, вы могли бы вырезать и вставить свой реальный код. В нем есть опечатки, такие как addobject вместо addObject и setions вместо sections.

Будет ли это работать, если вы сделаете все просто и сделаете NSLog(@"%d", section.Id), чтобы не возиться с массивом?

person Dominic Cooney    schedule 13.10.2010
comment
В настоящее время я не могу опубликовать полный код, потому что я далеко от своего Mac. Я не знаю, помогает ли это, но в моем производственном коде значение section.Id устанавливается из данных, проанализированных из json. Может дело в кастинге? Что касается номера 5447889, который я разместил, это были просто случайные номера. - person Chris; 13.10.2010
comment
Вы должны подтвердить значение, которое вы устанавливаете Id. - person Dominic Cooney; 13.10.2010

Что касается странных значений, см. Ответ Доминика Куни.

Что касается EXC_BAD_ACCESS: [[section Id]integerValue]; не работает, потому что затем он пытается интерпретировать NSInteger как объект и пытается отправить ему сообщение integerValue, что не может работать. Это целое число, а не объект.

person DarkDust    schedule 13.10.2010

Думаю, я нашел ответ на свой вопрос. Установка значения NSInteger на значение, скажем, 6 — это нормально. У меня проблема в том, что я устанавливаю значение, возвращаемое из строки Json, используя следующее:

NSInteger i = [jsonResult objectForKey:@"Id"];

что должно быть:

NSInteger i = [[jsonResult objectForKey:@"Id"] integerValue];

Я не проверял это, но имеет смысл, основываясь на том, что DarkDust сказал о integerValue, принимающем объект, а не Integer.

Спасибо за ваш вклад.

person Chris    schedule 13.10.2010