2011-07-12 38 views
10

Nếu số nguyên không thể được ghi vào từ điển và sau đó vào một .plist, nhưng NSNumbers có thể tốt hơn khi sử dụng NSNumbers trong suốt ứng dụng, thay vì cần phải chuyển đổi mỗi lần lưu hoặc tải từ điển từ. plist?NSNumber vs Int

+0

Lưu ý rằng việc phân bổ bộ nhớ tốn kém. Bạn có thể muốn tạo lớp của riêng bạn tương tự như NSNumber có thể thay đổi được. –

+0

Ưu tiên 'NSInteger' trên' int'. Điều này dễ di chuyển hơn trong các phiên bản khác nhau của OS X. – mouviciel

+0

Bạn chỉ có thể thay thế một 'NSNumber' (một đối tượng) cho một' int' (một giá trị vô hướng ").Sẽ vô cùng khó xử khi giữ mọi số lượng trong một số 'NSNumber' và chuyển đổi từ/sang cho mỗi lần tính toán. Sử dụng 'NSInteger' thay vì' int', mặt khác, là một điều hợp lý để làm. –

Trả lời

8

Như một sự tổng quát: Chỉ cần gắn bó với loại POD cho đến khi bạn cần sử dụng một đại diện dựa trên đối tượng, chẳng hạn như NSNumber. Hiệu suất tốt hơn nhiều với POD, nhưng bạn sẽ cần NSNumber trong một số trường hợp.

Trong một số trường hợp, nó có thể làm cho tinh thần để sử dụng NSNumber thay vì - đây là điển hình khi bạn tái sử dụng một NSNumber thường - điều này là để tránh làm cho một tấn trùng lặp NSNumber s. Sự xuất hiện như vậy là thực tế hiếm khi vượt ra ngoài serialization và các giao diện objc chung (ràng buộc, máy biến áp, từ điển).


Cập nhật/Thông tin chi tiết: Thời gian chạy ObjC sẽ trong một số trường hợp, trên một số kiến ​​trúc, và trên một số phiên bản hệ điều hành thay thế một tagged con trỏ đại diện NSNumber s của loại hình cụ thể và tên miền. Mặc dù các đại diện nội bộ đã thay đổi kể từ ban đầu được viết một vài năm trở lại, đây là một giới thiệu tốt về chủ đề: http://objectivistc.tumblr.com/post/7872364181/tagged-pointers-and-fast-pathed-cfnumber-integers-in. Trường hợp này có thể được sử dụng, nó sẽ giúp bạn tiết kiệm từ các hoạt động chậm như phân bổ, khóa, và số lượng ref. Tuy nhiên, các con trỏ được gắn thẻ không thể đại diện cho mọi số và nó giới thiệu chi phí, vì vậy bạn vẫn nên ưu tiên các nội trang cơ bản trên NSNumber làm mặc định. Con trỏ được gắn thẻ là một tối ưu hóa tuyệt vời nếu có, nhưng không cạnh tranh với nội trang khi bạn chỉ cần số .

+1

Điều tuyệt vời là KVC hỗ trợ autoboxing, tức là chuyển đổi giữa các loại vô hướng và NSNumber, vì vậy có rất ít nhu cầu sử dụng NSNumber trong các thuộc tính. – DrMickeyLauer

+0

Bạn có thể muốn sửa đổi điều này xem xét các tác động của thiết bị 64 bit. Đã thêm cập nhật – user

+2

@user – justin

0

NSNumber là đối tượng được kế thừa từ đối tượng trình bao bọc NSValue.

int không phải là đối tượng.

nếu sử dụng NSNumber u có thể nhận được nhiều hơn và nhiều chức năng hơn để sử dụng với chúng.

http://developer..com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html

NSNumber là một lớp học giúp bạn lưu trữ các loại số như đố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 ngày biến kiểu NSNumber * theo cách bạn đã làm trong ví dụ của mình, bạn không sửa đổi giá trị trong ngày nhưng địa chỉ bộ nhớ của nó.

0

Tất cả đều tùy thuộc vào nhu cầu của bạn. Tuy nhiên, nếu API yêu cầu bạn sử dụng int, bạn nên sử dụng int. Nó yêu cầu bạn sử dụng NSNumber bạn nên sử dụng NSNumber.

Ví dụ, nếu bạn đang sử dụng một UISegmentedControl , và bạn muốn chọn một phân đoạn, sau đó,

[segmentedControl setSelectedSegmentIndex:aIntVar]; // Can not use NSNumber here 
// or 
[segmentedControl setSelectedSegmentIndex:[aNumber intValue]];