Как напечатать значение NSInteger из NSManagedObject, используя NSLog - PullRequest
8 голосов
/ 07 октября 2009

Когда я пытаюсь вывести на консоль целочисленное значение, полученное из NSManagedObject, оно отображает 6-значное или 8-значное значение (идентификатор объекта?). Однако, если я использую отладчик, «Print Description to Console» отображается как однозначное значение, которое я ожидаю.

Например, я назначаю объект «sequence» NSInteger и затем отображаю, используя строку формата NSLog:

MyProcess *myProcess = [array objectAtIndex:i];
NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)myProcess.sequence] intValue];
NSLog(@"sequence = %d",myProcess.sequence);

Вывод на консоль:

2009-10-06 16:11:05.871 MyProcess[33185:20b] sequence = 565256

Но когда я пытаюсь «Печать в консоль» из отладчика, я вижу значение 1:

<MyStoryImage: 0x3f59a80> (entity: MyObject; id: 0x3f2d540 <x-coredata://FF21959A-  4B67-4587-A25F-66A7B8139DFA/MyProcess/p2> ; data: {
sequence = 1;
<x-coredata://FF21959A-4B67-4587-A25F-66A7B8139DFA/MyProcess/p1>;
})

Ваша помощь приветствуется!

Ответы [ 5 ]

12 голосов
/ 07 октября 2009

То, что вы получите от своего NSManagedObject, будет NSNumber, я думаю. Это легко напечатать, что:

MyProcess *myProcess = [array objectAtIndex:i];
NSLog(@"sequence = %@", myProcess.sequence);

или, если вам действительно нужен NSInteger:

MyProcess *myProcess = [array objectAtIndex:i];
NSLog(@"sequence = %i", [myProcess.sequence integerValue]);

Я думаю, что в этом фрагменте кода

NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)myProcess.sequence] intValue];

(NSInteger) myProcess.sequence фактически получает адрес памяти NSNumber. Вы не можете просто разыграть NSNumber в NSInteger.

1 голос
/ 07 октября 2009

Похоже, что myProcess.sequence - это NSNumber (объект), а не NSInteger (скаляр). Это объясняет, почему он правильно отображается в описании объекта, но не при явной попытке напечатать его как целое число.

0 голосов
/ 09 декабря 2014

Попробуйте это:

NSLog(@"sequence = %li",(unsigned long)myProcess.sequence);
0 голосов
/ 07 октября 2009

В зависимости от того, как построено приложение, NSInteger может быть 32-разрядным или 64-разрядным. Если это 64-битное значение, вам нужно сделать

NSLog(@"sequence = %qi", sequence) 

, чтобы правильно обрабатывать sequence как 64-битное значение. Обратите внимание, однако, что это не будет работать для 32-битных приложений; Насколько я знаю, нет единого спецификатора формата, который бы работал для печати NSInteger как в 32-битном, так и в 64-битном мире.

0 голосов
/ 07 октября 2009

NSInteger - просто целое число:

typedef int NSInteger;

В вашей первой строке кода:

NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)sequence] intValue];

Все, что вы делаете, это присваиваете последовательность себе, в обход. А поскольку он не инициализирован, это может быть любое случайное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...