2012-01-13 15 views
59

tôi muốn giữ NSUInteger vào dữ liệu cốt lõi của tôi và tôi không biết đó là loại tôi nên sử dụng (số nguyên 16, 32, 64) để phù hợp với không gian cần thiết.gì NSNumber (Integer 16, 32, 64) trong dữ liệu cốt lõi tôi nên sử dụng để giữ NSUInteger

Từ hiểu biết của tôi

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 

và NSUInteger là loại def của unsiged dài mà bằng int unsigned (Types in objective-c on iPhone)

nên nếu tôi chuyển đổi NSUInteger tôi để NSNumber với numberWithUnsignedInteger: và lưu nó như NSNumber (Integer 32) Tôi có thể lấy lại dữ liệu của mình một cách an toàn không?

Trả lời

15

Bạn có thực sự cần toàn bộ phạm vi của một NSUInteger? Trên iOS là một giá trị 32 bit chưa ký, có thể rất lớn. Nó sẽ tìm thấy một bit 64 ký.

Nhưng có lẽ bạn không cần phải có độ chính xác nhiều anyway. Số tiền tối đa cho số uint32_tUINT32_MAX là 4,294,967,295 (4 tỷ). Nếu bạn tăng mỗi giây một lần, bạn sẽ mất hơn 136 năm để đạt được giá trị đó. iPhone của người dùng của bạn sẽ không được xung quanh bằng cách sau đó ... :)

+24

này không thực sự trả lời câu hỏi. Làm thế nào để bạn biết loại dữ liệu ông đang lưu trữ? Tôi đã có nhiều trường hợp khi tôi cần lưu trữ một số lớn hơn 4 tỷ. – Brandon

+0

Ví dụ: 'var str2 =" chuỗi nhỏ với hashValue lớn "' 'in (str2.hashValue)' '// 4799450061348893706' –

+0

không hữu ích - có lẽ anh ta đang sử dụng int làm cách lưu trữ trạng thái trên 32 thuộc tính riêng biệt - số 32 sẽ lật tất cả các bit và tạo ra nhiều thứ – SimonTheDiver

6

Nếu có thể, khi ghi dữ liệu vào đĩa hoặc qua mạng, nó là tốt nhất để được rõ ràng về kích thước của giá trị. Thay vì sử dụng NSUInteger như datatype, sử dụng uint16_t, uint32_t, hoặc uint64_t tùy thuộc vào phạm vi mà bạn cần. Điều này sau đó tự nhiên chuyển thành Integer 16, 32 và 64 trong Core Data.

Để hiểu tại sao, hãy xem xét kịch bản này:

  1. Bạn lựa chọn để sử dụng Integer 64 loại để lưu trữ giá trị của bạn.
  2. Trên thiết bị iOS 64 bit (ví dụ: iPhone 6), nó lưu trữ giá trị 5.000.000.000.
  3. Trên một thiết bị iOS 32-bit giá trị này được lấy từ các cửa hàng thành một NSUInteger (sử dụng NSNumber của unsignedIntegerValue).

Hiện tại vì NSUInteger chỉ là 32 bit trên thiết bị 32 bit, số không còn 5.000.000.000 vì không có đủ bit đại diện cho 5 tỷ. Nếu bạn đã đổi số NUInteger ở bước 3 cho uint64_t thì giá trị sẽ vẫn là 5 tỷ.

Nếu bắt buộc phải sử dụng NSUInteger, sau đó bạn sẽ chỉ cần phải lo lắng về những vấn đề đã nêu ở trên và mã phòng thủ cho nó.

Theo như lưu trữ các giá trị unsigned vào dường như ký kết các loại Core Data, bạn có thể yên tâm lưu trữ chúng và lấy chúng:

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