2010-06-13 64 views
22

Tôi có một dòng mã sẽ hoạt động khác nhau tùy thuộc vào kiểu dữ liệu "ngày" và "1". Tôi tin rằng nó là sau đây mặc dù tôi sẽ kiểm tra mã nguồn của tôi sau này.int vs NSNumber vs NSInteger

day = day + 1;

Điều này có hợp lý không? Sự khác biệt sẽ là gì?

Trả lời

42

NSInteger là định nghĩa loại mô tả số nguyên - nhưng nó KHÔNG tương đương với int trên nền tảng 64 bit.
Bạn có thể kiểm tra typedef bằng cách nhấp chuột cmd trên NSInteger trong Xcode.
NSInteger được định nghĩa là int khi tạo ứng dụng 32 bit và dưới dạng long cho ứng dụng 64 bit.
Hầu hết thời gian bạn có thể thay thế int bằng NSInteger, nhưng có một số điều cần cân nhắc khi làm như vậy.
Apple's 64-Bit Transition Guide for Cocoa có một số thông tin về điều đó.

NSNumber là lớp giúp bạn lưu trữ các loại số làm đối tượng. Nó có các phương thức để chuyển đổi giữa các kiểu và các phương thức khác nhau để lấy ra một biểu diễn chuỗi của giá trị số của bạn.
Nếu bạn sử dụng biến số day loại NSNumber* cách bạn đã làm trong ví dụ của mình, bạn không sửa đổi giá trị day nhưng địa chỉ bộ nhớ của nó.

Nếu bạn đang làm việc với các giá trị thời gian, bạn cũng có thể xem NSDate.

+1

Thú vị ... có vẻ giống như một điểm quan trọng ... – Moshe

2

1 là chữ và trình biên dịch sẽ biến nó thành loại số thích hợp nếu thích hợp.

Lưu ý, tuy nhiên, trong khi NSIntegerint là hầu hết các mục đích và mục đích giống nhau, thì NSNumber là một loại đối tượng. Đối với trường hợp đó, mã của bạn không có ý nghĩa (và không nên biên dịch mà không có cảnh báo).

(Trên thực tế, có một số trường hợp nó sẽ làm cho một loại cảm giác, về con trỏ số học, nhưng điều đó hoàn toàn không phải những gì bạn muốn.)

Đối với trường hợp NSNumber, bạn muốn thay vì muốn một cái gì đó như:

day = [NSNumber numberWithInt:[day intValue] + 1]; 
2

NSIntegerint là tương đương, NSNumber là một đối tượng sử dụng để lưu trữ các loại số nguyên thủy (int, long, float, vv).

Mã mẫu bạn đã đăng sẽ hoạt động tốt nếu dayNSinteger, mã sẽ không hoạt động nếu đó là số NSNumber.

+2

NSInteger và int là không tương đương cho các ứng dụng 64-bit. (NSInteger được định nghĩa là dài đối với các ứng dụng 64 bit). Mã ví dụ được đăng cũng sẽ hoạt động nếu ngày là một phiên bản của NSNumber nhưng số gia tăng sẽ không thay đổi giá trị mà là địa chỉ của người nhận. Điều này rất có thể không phải là những gì OP muốn. –

+0

Đối với NSObject, trình biên dịch sẽ không cho phép bạn thực hiện số học con trỏ. – gnasher729

8

NSInteger là một số nguyên đơn giản, NSNumber là một đối tượng trong đó int là loại dữ liệu nguyên thủy.

NSInteger không gì khác ngoài một từ đồng nghĩa cho một số nguyên dài.

Nếu bạn cần lưu trữ một số ở đâu đó, hãy sử dụng NSNumber.Nếu bạn đang thực hiện các phép tính, vòng lặp, vv, hãy sử dụng NSInteger, NSUInteger hoặc int.

Bạn có thể quấn một NSInteger thành một NSNumber sử dụng:

NSNumber *NumberToStore = @(21); 

và làm cho nó trở lại sử dụng:

NSInteger retrievingInteger = [NumberToStore integerValue]; 
+0

NSNumber nếu bạn cần lưu trữ một số _một đối tượng_. Ví dụ trong một NSDictionary hoặc một NSArray hoặc một NSSet. – gnasher729