2016-09-26 1 views
-2

У меня есть NSNumber, и когда я пытаюсь выполнить базовую арифметику, это терпит неудачу.Objective C Арифметический сбой

NSNumber *contentExpirationInDays = [NSNumber numberWithInt: 1]; 

Когда я пытаюсь сделать основной умножения для преобразования секунд он дает мне сумасшедшие цифры:

NSTimeInterval contentExpirationInSecs = [contentExpirationInDays intValue] * 24 * 60 * 60; 

Примечание: Следующий бит теперь не имеет значения, как описано в некоторых ответах:

Когда я запускаю следующие команды на консоли, я получаю следующие результаты:

(lldb) po [contentExpirationInDays intValue] 
1 

(lldb) po [contentExpirationInDays intValue] * 2 
-148319360 

UPDATE

Спасибо за информацию о ро против р. Я не знал, что подробно ...

Так вот реальная проблема, что я испытываю:

NSNumber *contentExpirationInDays = [[NSNumber numberWithInt:1]; 
NSTimeInterval contentExpiration = ([contentExpirationInDays intValue] * 24 * 60 * 60); 
myObj.expirationDate = [[NSDate date] dateByAddingTimeInterval:contentExpiration]; 

obj.expirationDate обычно заканчивается много лет в будущем или много лет в прошлом, вместо на один день опередив сегодня.

+3

'po' является«печать объекта». Используйте 'p' для печати целых чисел или других скалярных значений. –

+0

Какую версию Xcode вы используете? Работает отлично на моем Xcode 8. –

+0

Это работает и для меня, если я удалю лишний '[' после назначения ('=') в первой строке. Однако расчет даты немного наивен. –

ответ

-1

NSNumber - это базовый класс для объектов, представляющих числа, а не примитивное скалярное значение, такое как int или float.

Если вам нужен ваш номер в качестве объекта, вместо него используйте NSDecimalNumber. В противном случае просто оставьте его как скалярный тип.

+1

Он преобразует его в скаляр, используя '-intValue'. –

+0

Упс. Извините, ребята, мое плохое. Научите меня слишком быстро читать. – drekka

1

ро просит отладчик печати описание объекта по адресу, указанному в данном указателе. Как сказал Мартин R, используйте р вместо этого просто распечатав скалярные значения:

p [contentExpirationInDays intValue] * 2