Преобразование (u) int64_t в NSNumbers - PullRequest
9 голосов
/ 19 сентября 2010

Итак, по сути, мой вопрос заключается в следующем: я создаю NSMutableDictionary с использованием объектов uint64_t в качестве ключа.

Есть ли лучший способ создать их, чем делать это?

uint64_t bob=7;

NSNumber *bobsNumber;

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
bobsNumber=[NSNumber numberWithUnsignedLong:bob];
#else
bobsNumber=[NSNumber numberWithUnsignedLongLong:bob];
#endif

Это будет работать до тех пор, пока вы не включите его в двоичный файл / сокеты / объект NSData / что угодно. Но есть ли лучший способ сделать это? Я действительно хотел бы быть уверен, что объект является 64-битным независимо от того, на какой платформе я его запускаю.

Полагаю, я мог бы просто избежать всей этой проблемы, всегда оставляя unsigned long long, но, конечно, это тратило бы тонны пространства кучи на 64-битных машинах, если бы я выделил эти объекты в любых значительных числах ....

1 Ответ

16 голосов
/ 19 сентября 2010

long long является 64-разрядным на 64-разрядных платформах OS X / iOS.На всех платформах, опущенных OpenStep, numberWithUnsignedLongLong: является правильным для uint64_t.

В прошлый раз, когда я проверял, какой метод фабрики вы используете, фактически не влияет на используемое представление;оно зависит только от значения числа (если только вы не используете слишком маленький размер, из-за которого оно усекается).

Обновление: В наши дни правильный ответ - NSNumber *bobsNumber = @(bob);.

...