2011-10-02 48 views
36

Sự khác biệt chính giữa int, NSIntegerNSUInteger trong Mục tiêu-C là gì?Sự khác biệt giữa int, NSInteger và NSUInteger

Điều nào tốt hơn để sử dụng trong một ứng dụng và tại sao?

+0

Không có thứ gì như 'NSInt'. – BoltClock

+0

NSInteger không NSInt .. – Hitarth

+2

[Xem tài liệu] (http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Misccellaneous/Foundation_DataTypes/Reference/reference.html) – Jiri

Trả lời

29

Trong trường hợp này bạn có thể nhấp chuột phải và đi đến định nghĩa:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
typedef unsigned long NSUInteger; 
#else 
typedef int NSInteger; 
typedef unsigned int NSUInteger; 
#endif 
+0

ok thanx i nhận được nó – Hitarth

+0

dễ dàng và chính xác –

20

Sự khác biệt là đối với các loại trừu tượng và đối tác của họ có kích thước từ phần cứng. Theo cách mà bây giờ chúng tôi không phải lo lắng về kích thước của một int là hoặc lớn như thế nào nó là con trỏ trên bất kỳ phần cứng cụ thể.

"C" là xấu, chỉ ra rằng một dài ít nhất là lớn như int, rằng int là kích thước nguyên "tự nhiên" của phần cứng (điều đó có nghĩa), rằng int là tại ít nhất là một đoạn ngắn - một mớ hỗn độn lớn.

Điều này dường như là một ý tưởng hay vào thời điểm đến từ Fortran, nhưng không đủ tuổi.

Có thể sử dụng định nghĩa POSIX, những thứ như uint32_t, int16_t, v.v. Nhưng điều này không giải quyết được con trỏ cần phải lớn đến mức nào trên bất kỳ phần cứng cụ thể nào. Vì vậy, nếu Apple định nghĩa kiểu trả về là NSUInteger bạn chỉ sử dụng và bạn không cần phải biết nó có kích thước 16, 32 hay 64 bit cho phần cứng cụ thể của bạn hay không. (Tôi đã chọn những giá trị đó ngoài một ví dụ).

Như bạn thấy trong @Bastian, kích thước thực tế phụ thuộc vào phần cứng.

Tài liệu trả lời "thư của câu hỏi" nhưng không cung cấp hiểu biết về "lý do"?

+0

bạn r đúng. chúng tôi chỉ nhận được sự khác biệt giữa chúng nhưng tại sao? tôi vẫn chưa nhận được, hãy đề nghị tôi – Hitarth

+3

Đó là chuẩn hóa API. Các khung công tác này phân phối trên nhiều kiến ​​trúc - tốt cho API giống nhau trên tất cả các cấu trúc đó. Bằng cách có các typedef này, Apple đang trừu tượng hóa sự khác biệt về nền tảng so với người tiêu dùng API. Nếu bạn chỉ nói với API về các loại này, thì (theo lý thuyết) bạn không cần phải suy nghĩ về sự khác biệt nền tảng khi biên dịch cùng mã cho i386, x86_64, ppc, arm7 hoặc bất kỳ thứ gì. Đó là một trừu tượng. Người ta nói rằng bạn nên sử dụng mức trừu tượng cao nhất để hoàn thành công việc. Vì vậy, trừ khi bạn có lý do KHÔNG sử dụng các loại này, tôi nói sử dụng chúng. – ipmcc

Các vấn đề liên quan