2012-12-09 36 views
6

Cả hai phương thức đều trả về kết quả bằng nhau. Tất nhiên, -[NSObject isEqual:] không so sánh các con trỏ của các đối tượng, bằng cách nào đó kiểm tra các lĩnh vực bên trong hoặc bất cứ điều gì. Vì vậy, điểm của việc sử dụng chính xác -[NSNumber isEqualToNumber:] để so sánh hai NSNumber là gì?- [NSObject isEqual:] và - [NSNumber isEqualToNumber:]: sự khác biệt là gì?

+0

'-isEqual:' kiểm tra băm đối tượng (trừ khi bị ghi đè). – CodaFi

+0

@CodaFi Có vẻ như trong 'NSNumber' nó bị ghi đè (vì hai' NSNumber' có băm bằng nhau không bằng nhau cho 'isEqual'). Đó là câu hỏi. – efpies

Trả lời

8

Từ docs:

Hai đối tượng NSNumber được coi là bằng nhau nếu chúng có cùng id giá trị hoặc nếu họ có giá trị tương đương (được xác định bởi so sánh: Phương pháp). Phương pháp này hiệu quả hơn so sánh: nếu bạn biết hai đối tượng là số.

Vì vậy, nó xử lý id bằng và so sánh số.

+1

Ý nghĩa của chúng sau "giá trị tương đương" là gì? '@ 1' và' @ 1.0' tương đương với khóa học, nhưng có một ví dụ về các giá trị khi 'isEqualToNumber' chính nó * phải * được sử dụng không? Hãy xem xét các bài kiểm tra của tôi ngay cả đối với '@ 1' và' @ 1.0000000001' (thậm chí có băm bằng nhau và các con trỏ khác nhau) 'isEqual' và' isEqualToNumber' có kết quả bằng nhau. – efpies

+0

Nếu so sánh: trả về NSOrderedSame, chúng là các giá trị tương đương. Tôi sẽ đoán rằng isEqual đại biểu để isEqualToNumber nếu họ không phải là cùng một đối tượng và cả hai đều NSNumbers. –

+5

@TerryWilcox Bạn nói đúng. Xem dòng 416 của [NSNumber.m] (https://code.google.com/p/cocotron/source/browse/Foundation/NSNumber/NSNumber.m). –

-2

-[NSObject isEqual:] kiểm tra xem hai đối tượng có địa chỉ con trỏ và băm trong khi -[NSNumber isEqualToNumber:] kiểm tra xem các giá trị có giống nhau hay không.

NSNumber s có giá trị bằng nhau có cùng địa chỉ con trỏ.

+0

Vì vậy, tôi hy vọng rằng '@ 1' và' @ 1.0' sẽ có băm bằng nhau. Không? Nhưng thực tế họ làm. – efpies

+0

NSNumber không bảo toàn loại. NSNumber từ 0 đến 12 được lưu trong bộ nhớ cache, vì vậy cả hai đều có thể là cùng một đối tượng. –

+1

Việc thực hiện mặc định của isEqual: so sánh hai id đối tượng, không phải hash. Hai đối tượng không bằng nhau có thể có cùng một giá trị băm. –

2

Về cơ bản chúng giống hệt nhau, mặc dù isEqual phải thực hiện kiểm tra kiểu trên lớp của đối tượng được truyền vào. IsEqualToNumber thực hiện kiểm tra kiểu tại thời gian biên dịch, tốt hơn khi có thể.

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