2009-08-08 27 views
148

Khi xem tài liệu, tôi hầu như không thấy có sự khác biệt lớn nào. Cả "giá trị" và "đối tượng" đều thuộc loại id, vì vậy có thể là đối tượng bất kỳ. Khóa là một chuỗi và trong trường hợp khác là id. Một trong số họ dường như giữ lại đối tượng, và người kia thì không. Còn gì nữa? Cái nào là cho trường hợp gì?Sự khác nhau giữa setObject: forKey: và setValue: forKey: trong NSMutableDictionary ở đâu?

+0

bản sao có thể có của [Mục tiêu-C: Sự khác nhau giữa objectForKey và valueForKey là gì?] (Http://stackoverflow.com/questions/1062183/objective-c-whats-the-difference-between-objectforkey-and-valueforkey) – Mark

Trả lời

157

setValue:forKey: là một phần của giao thức NSKeyValueCoding, trong số những thứ khác, cho phép bạn truy cập các thuộc tính đối tượng từ các công cụ như Trình xây dựng giao diện. setValue:forKey: được triển khai trong các lớp khác ngoài NSDictionary.

setObject:forKey:NSMutableDictionary's lý do tồn tại. Chữ ký của nó xảy ra khá giống với setValue: forKey :, nhưng là tổng quát hơn (ví dụ: bất kỳ loại khóa nào). Đó là một sự trùng hợp ngẫu nhiên rằng chữ ký rất giống nhau.

Điều thêm vào sự nhầm lẫn là việc triển khai NSMutableDictionary setValue:forKey: tương đương với setObject:forKey: trong hầu hết các trường hợp. Trong các lớp khác, setValue:forKey: thay đổi biến thành viên. Trong NSMutableDictionary, nó thay đổi các mục nhập từ điển, trừ khi bạn đặt tiền tố cho khóa bằng ký tự '@' - trong trường hợp này nó thay đổi các biến thành viên.

Vì vậy, trong Tóm lại, sử dụng setObject:forKey: khi bạn cần phải làm việc với các phím từ điển và các giá trị, và setValue:forKey: trong các trường hợp hiếm khi bạn cần phải giải quyết KVP.

EDIT: và oh, nó trông như thế này đã được hỏi và trả lời trước: Difference between objectForKey and valueForKey?

+0

câu hỏi đó không hoàn toàn giống nhau.Đó là về các phương thức getter, trong khi câu hỏi này là về các phương thức setter – user102008

+1

Bạn có ý nghĩa gì bởi "Trong NSMutableDictionary, nó thay đổi các mục từ điển, trừ khi bạn thêm tiền tố với ký tự '@'. . " Biến thành viên nào? Bạn cũng có thể nhận xét về http://stackoverflow.com/questions/5755917/? Cảm ơn. –

+0

chỉ để hoàn thành, setObject: forKey sẽ tăng (ngoại lệ) nếu đối tượng là nil. Sẽ setValue: forKey hành xử giống nhau, hoặc nó sẽ loại bỏ đối tượng hiện có từ điển khi thiết lập nil cho khóa? –

80

khác biệt nữa là nếu bạn đưa ra một giá trị nil để setValue:forKey:, nó loại bỏ phím từ điển nếu nó tồn tại, nếu không thì không có gì. Nhưng nếu bạn đưa ra một giá trị nil đến setObject:forKey:, nó sẽ đưa ra một ngoại lệ.

+10

Điều này rất hữu ích để biết. Tôi đã viết bằng văn bản danh mục của riêng mình trên NSMutableDictionary để thực hiện chính xác điều này !. Cảm ơn – Arman

+2

Một khác biệt khác là với subscripting khách quan-c, bạn có thể viết 'dic [key] = value;' để hỗ trợ loại bỏ khóa nếu giá trị là 'nil'. Subscripting nói chung là một cách tiếp cận tốt hơn 'setValue: forKey:' để thực hiện điều này. –

3

anObject — Giá trị cho khóa. Đối tượng nhận được thông báo giữ lại trước khi được thêm vào NSDictionary. Giá trị này không được là 0.

aKey — Khóa cho giá trị. Khóa được sao chép (sử dụng copyWithZone:; các khóa phải tuân theo giao thức NSCopying). Khóa không được là số không.

giá trị — Giá trị cho khóa.

phím — Khóa cho giá trị. Lưu ý rằng khi sử dụng mã hóa khóa-giá trị, khóa phải là một chuỗi (xem “Nguyên tắc cơ bản về mã hóa khóa-giá trị”).

+0

Cảm ơn bạn đã đưa ra lý do tại sao setObject: forKey: tăng ngoại lệ. @breakfreehg –

5

-setValue:forKey: chỉ cần gửi -setObject:forKey: cho người nhận, trừ trường hợp giá trị là nil, trong trường hợp gửi -removeObjectForKey.

Đơn giản chết.

+0

Đây chính là cách hoạt động của nó. –

+0

oh bạn nói đúng, bro. Xin lỗi vì điều đó. Tài liệu được ghi ở đây: https://developer.apple.com/reference/foundation/nsmutabledictionary/1416335-setvalue?language=objc – Eddie

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