2009-06-30 41 views

Trả lời

387

objectForKey: là phương thức NSDictionary. An NSDictionary là một lớp sưu tập tương tự như một NSArray, ngoại trừ thay vì sử dụng các chỉ mục, nó sử dụng các phím để phân biệt giữa các mục. Khóa là một chuỗi tùy ý mà bạn cung cấp. Không có hai đối tượng có thể có cùng một khóa (giống như không có hai đối tượng trong một NSArray có thể có cùng một chỉ mục).

valueForKey: là phương pháp KVC. Nó hoạt động với bất kỳ lớp học nào. valueForKey: cho phép bạn truy cập thuộc tính bằng cách sử dụng một chuỗi cho tên của nó. Vì vậy, ví dụ, nếu tôi có một lớp Account với một tài sản accountNumber, tôi có thể làm như sau:

NSNumber *anAccountNumber = [NSNumber numberWithInt:12345]; 
Account *newAccount = [[Account alloc] init]; 

[newAccount setAccountNumber:anAccountNUmber]; 

NSNumber *anotherAccountNumber = [newAccount accountNumber]; 

Sử dụng KVC, tôi có thể truy cập vào các tài sản tự động:

NSNumber *anAccountNumber = [NSNumber numberWithInt:12345]; 
Account *newAccount = [[Account alloc] init]; 

[newAccount setValue:anAccountNumber forKey:@"accountNumber"]; 

NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"]; 

Đó là những bộ tương đương với các câu lệnh.

Tôi biết bạn đang suy nghĩ: wow, nhưng mỉa mai. KVC trông không hữu ích lắm. Trong thực tế, nó trông "dài dòng". Nhưng khi bạn muốn thay đổi mọi thứ trong thời gian chạy, bạn có thể thực hiện rất nhiều điều thú vị khó hơn nhiều trong các ngôn ngữ khác (nhưng điều này nằm ngoài phạm vi câu hỏi của bạn).

Nếu bạn muốn tìm hiểu thêm về KVC, có nhiều hướng dẫn nếu bạn đặc biệt là Google tại Scott Stevenson's blog. Bạn cũng có thể xem số NSKeyValueCoding Protocol Reference.

Hy vọng điều đó sẽ hữu ích.

+12

valueForKey hoạt động khác nhau đối với các đối tượng NSDictionary tùy thuộc vào việc khóa có bắt đầu bằng biểu tượng @ hay không. – dreamlax

+57

objectForKey: chấp nhận bất kỳ đối tượng nào làm khóa, không chỉ là chuỗi. Yêu cầu duy nhất là khóa hỗ trợ giao thức NSCopying. –

+0

Cả hai điểm này chắc chắn là đúng. NSDictionaries là một trường hợp đặc biệt và bạn không phải sử dụng chuỗi cho các khóa. Tôi đã không thực sự đi vào sự tinh tế của một trong hai vì có vẻ như người hỏi chỉ cần một so sánh đơn giản. –

61

Khi bạn làm valueForKey:, bạn cần cung cấp cho nó NSString, trong khi objectForKey: có thể lấy bất kỳ lớp con NSObject nào làm khóa. Điều này là do Mã hóa khóa-giá trị, các khóa luôn là chuỗi.

Trong thực tế, các tài liệu nói rằng ngay cả khi bạn cung cấp cho valueForKey: một NSString, nó sẽ gọi objectForKey: nào trừ khi chuỗi bắt đầu với một @, trong trường hợp này nó gọi [super valueForKey:], có thể gọi valueForUndefinedKey: có thể nâng cao một ngoại lệ.

+0

bạn có thể vui lòng cho tôi liên kết của tài liệu bạn muốn nói không.cảm ơn bạn. –

+5

@ عليامين: [It's right here] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html#//apple_ref/doc/uid/ 20000140-BBCIBCDJ) – dreamlax

20

Dưới đây là một lý do tuyệt vời để sử dụng objectForKey: bất cứ nơi nào có thể thay vì valueForKey: - valueForKey: với một chìa khóa chưa biết sẽ ném NSUnknownKeyException nói "lớp này không phải là giá trị quan trọng mã hóa tuân thủ cho phím".

+5

tốt để biết rằng "valueForKey: với một khóa không xác định sẽ ném NSUnknownKeyException nói" lớp này không phải là giá trị khóa mã hóa tuân thủ cho khóa " – onmyway133

10

Như đã nói, kiểu dữ liệu objectForKey::(id)aKey trong khi kiểu dữ liệu valueForKey::(NSString *)key.

Ví dụ:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil]; 

NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]); 
    //This will work fine and prints ( 123 ) 

NSLog(@"valueForKey : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]); 
    //it gives warning "Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'" ---- This will crash on runtime. 

Vì vậy, valueForKey: sẽ chỉ mất một giá trị chuỗi và là một phương pháp KVC, trong khi objectForKey: sẽ mất bất kỳ loại đối tượng.

Giá trị trong objectForKey sẽ được truy cập bởi cùng một loại đối tượng.

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