2013-02-14 8 views
5

Bây giờ chúng ta có các chữ số NSNumber với sự hỗ trợ trình biên dịch trong Objective-C, có cách nào ưu tiên để so sánh NSNumber với một giá trị nguyên được biết không?Giá trị nguyên thủy của NSNumber so với isEqualToNumber với Obj-C Literals

Cách cũ là [myNumber integerValue] == 5

Bây giờ chúng ta có thể làm [myNumber isEqualToNumber:@5] hoặc thậm chí [myNumber isEqualToNumber:@(someVariable)].

Có lợi thế nào cho phương pháp isEqualToNumber: hay chúng tôi nên gắn với integerValue trừ khi giá trị để so sánh với đã là một NSNumber?

Một lợi thế mà tôi có thể thấy là nếu một số thay đổi Biến đổi từ NSInteger thành CGFloat, không cần thay đổi mã nào cho cách mới.

Trả lời

10

Cách mới thực sự là một cú pháp mới xung quanh cũ

[myNumber isEqualToNumber:[NSNumber numberWithInt:5]] 

đòi hỏi một cuộc gọi thêm numberWithInt:; về cơ bản, chúng tôi đang so sánh một giải pháp với một công văn đơn và phân bổ không cho một giải pháp với hai công văn, và có thể là một phân bổ/deallocation.

Nếu bạn thực hiện so sánh này bên ngoài vòng lặp chặt chẽ, điều đó không quan trọng. Nhưng nếu bạn làm điều đó trong một vòng lặp thực sự chặt chẽ, có lẽ trong khi vẽ một cái gì đó, bạn có thể thấy một slowndown. Đó là lý do tôi ở lại với phương pháp cũ của

[myNumber integerValue] == 5 
+0

sẽ autoboxing/unboxing có bao giờ đến Mục tiêu C không? –

+1

@AmoghTalpallikar Không, nhưng điều gần nhất tiếp theo là ở đây: '[myNumber isEqualToNumber: @ 5]' – dasblinkenlight

+0

sẽ == kiểm tra công việc cho NSNumbers nếu chúng đại diện cho cùng một số hoặc bool? myNumber == @ 5 hoặc status == @YES –

3

"Cách cũ" là một cuộc gọi phương thức cộng với toán tử so sánh với hai loại cơ bản.

"Cách mới" là một cuộc gọi phương thức cộng với tạo đối tượng bổ sung.

Vì vậy, cách cũ hiệu quả hơn. Nhưng trừ khi điều này được thực hiện trong một vòng lặp hiệu suất cao (hoặc một cái gì đó tương tự), sự khác biệt là không đáng kể.

Như bạn đã nói, cách mới có thể linh hoạt hơn đối với loại số cụ thể.

Cá nhân, tôi muốn chọn biểu mẫu mà bạn thấy dễ đọc hơn và có thể duy trì trừ khi bạn có vấn đề về hiệu suất rõ ràng và cụ thể để giải quyết.

Mặc dù bạn có thể có lý do cụ thể để so sánh giá trị float hoặc giá trị số nguyên bất kể giá trị ban đầu. Trong trường hợp này, cách cũ là tốt hơn vì loại so sánh là rõ ràng.

2

Câu trả lời ngắn:[myNumber integerValue] == 5 vẫn là tốt nhất.

Dài (nhưng có thể bạn không nên quan tâm) trả lời: Khởi động iOS 5, "một số" NSNumbers được triển khai bằng cách sử dụng con trỏ được gắn thẻ (quick google). Điều này có nghĩa miễn là giá trị NSNumber phù hợp với 24 bit (đối với bộ xử lý ARM 32 bit của iPhone/iPad), không có cá thể thực tế nào được tạo ra. Vì vậy, về lý thuyết, nếu bạn chắc chắn rằng các giá trị sẽ không bao giờ tràn 24 bit, bạn thực sự có thể thực hiện chỉ myNumber == @5.

Đó không thực sự là lời khuyên hay. Dính vào [myNumber integerValue] == 5. Con trỏ được gắn thẻ ở đó để giúp thời gian chạy, không phải là lập trình viên.