Подтвердить что ты не робот

Что 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), я мог бы правильно восстановить мои данные?

4b9b3361

Ответ 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