Objective-C обрабатывает целочисленные значения - PullRequest
0 голосов
/ 13 октября 2010

Я путаюсь с тем, как обращаться с целыми числами в цели 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".

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

Большое спасибо

Ответы [ 3 ]

0 голосов
/ 13 октября 2010

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

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

0 голосов
/ 13 октября 2010

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

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

которое должно быть:

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

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

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

0 голосов
/ 13 октября 2010

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

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

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

...