Что NSNumber (Integer 16, 32, 64) в основных данных следует использовать для хранения NSUInteger
Я хочу сохранить NSUInteger в свои основные данные, и я не знаю, какой тип я должен использовать (целое число 16, 32, 64) в соответствии с требуемым пространством.
Из моего понимания
Integer 16 can have minimum value of -32,768 to 32,767
Integer 32 can have minimum value of -2,147,483,648 to 2,147,483,647
Integer 64 can have minimum value of -very large to very large
и NSUInteger - это тип def unsiged long, который равен unsigned int (Типы в objective-c на iPhone)
so Если я конвертирую свой NSUInteger в NSNumber с номеромWithUnsignedInteger: и сохраните его как NSNumber (Integer 32), я мог бы правильно восстановить мои данные?
Ответы
Ответ 1
Вам действительно нужен весь диапазон NSUInteger
? На iOS это 32-значное значение без знака, которое может стать очень большим. Он найдет подписанный 64-разрядный бит.
Но вам, вероятно, не нужна такая точность. Максимум для a uint32_t
составляет UINT32_MAX
, что составляет 4 294 967 295 (4 миллиарда). Если вы увеличиваете один раз в секунду, для достижения этой цели потребуется более 136 лет. Ваш пользовательский iPhone уже не будет рядом...:)
Ответ 2
Если это возможно, при записи данных на диск или через сеть лучше всего указывать размер значения. Вместо использования NSUInteger в качестве типа данных используйте uint16_t
, uint32_t
или uint64_t
в зависимости от диапазона, в котором вы нуждаетесь. Это, естественно, переводится в Integer 16, 32 и 64 в Core Data.
Чтобы понять, почему, рассмотрите этот сценарий:
- Вы можете использовать тип Integer 64 для хранения вашего значения.
- На 64-битном устройстве iOS (например, iPhone 6) оно хранит значение 5 000 000 000.
- На 32-битном устройстве iOS это значение извлекается из хранилища в
NSUInteger
(используя NSNumber unsignedIntegerValue
).
Теперь, поскольку NSUInteger
является 32-битным на 32-битном устройстве, число не превышает 5 000 000 000, потому что не хватает бит для представления 5 миллиардов. Если вы заменили NUInteger
на шаге 3 для uint64_t
, тогда значение все равно составляло бы 5 миллиардов.
Если вам абсолютно необходимо использовать NSUInteger, вам просто нужно быть осторожным в отношении описанных выше проблем и защищать код для него.
Что касается сохранения неподписанных значений в, казалось бы, подписанных типах основных данных, вы можете спокойно сохранить их и получить их:
NSManagedObject *object = // create object
object.valueNumber = @(4000000000); // Store 4 billion in an Integer 32 Core Data type
[managedObjectContext save:NULL] // Save value to store
// Later on
NSManagedObject *object = // fetch object from store
uint32_t value = object.valueNumber.unsignedIntegerValue; // value will be 4 billion