2013-08-03 24 views
9

Tôi đang cố gắng tự dạy cho mình mục tiêu-c bằng cách sử dụng cuốn sách nông trại lớn, đó là một cuốn sách thực sự tuyệt vời nhưng một số khía cạnh gây nhầm lẫn cho tôi.Mục tiêu-C setValue: forKey trên c loại nguyên thủy

Chương hiện tại đang nói về việc sử dụng setValue: hàm forKey mà tôi hiểu là một phương thức được xác định trong NSObject. Cuốn sách nói rằng bạn có thể sử dụng trên ac nguyên thủy như int hoặc float và đưa ra ví dụ này

Tôi có một lớp tùy chỉnh được gọi Appliance và nó là một biến Ví dụ số nguyên được gọi là điện áp mà các cửa hàng điện áp của hiện tại thiết bị tôi khởi tạo một thiết bị mới có tên gọi một

appliance *a = [[appliance alloc]init]; 
[a setValue:[NSNumber numberWithInt:240] forKey:@"voltage"]; 

sau đó ông thiết lập một setter tùy chỉnh cho điện áp và ghi lại những áp khi gọi của nó để chứng minh nó hoạt động

-(void)setVoltage:int(x) { 
NSLog(@"setting voltage to %d",x); 
voltage =x; 
} 

điều gì gây nhầm lẫn cho tôi là NSNumber numberWithInt trả về một con trỏ đến một đối tượng NSNumber được lưu trữ trên heap chính xác? do đó, làm thế nào để ông đăng nhập số nguyên được lưu trữ trong NSNumber bằng cách sử dụng mã thông báo% d. Tôi hiểu rằng sẽ đăng nhập một số nguyên nhưng không phải là một đối tượng được thông qua trong? hơn nữa tôi nghĩ rằng kể từ khi điện áp được định nghĩa là một số nguyên và không phải là một con trỏ đến một cái gì đó nó không thể giữ địa chỉ cho một đối tượng trong bộ nhớ của nó? hoặc là loại NSNumber buộc nó để giữ địa chỉ bộ nhớ của nó mà không thực sự có điện áp được khai báo như một con trỏ?

xin lỗi vì sự nhầm lẫn này chương về cơ bản đá mông của tôi.

+3

Lưu ý rằng trong thực hành mã hóa bình thường, bạn sẽ * thường không bao giờ sử dụng 'setValue: forKey:' hoặc 'valueForKey:' để đặt/nhận các giá trị trên một đối tượng *. Chỉ cần gọi trực tiếp setter/getter. KVC chủ yếu tồn tại để hỗ trợ những thứ như ràng buộc và các hình thức lập trình meta khác. – bbum

Trả lời

25

Việc chuyển đổi giữa các đối tượng và các loại vô hướng được xử lý tự động bằng các phương pháp mã hóa khóa-giá trị. Từ documentation:

Việc triển khai mặc định của valueForKey:setValue:forKey: cung cấp hỗ trợ cho gói đối tượng tự động của các dữ liệu phi vật thể loại, cả hai vô hướng và cấu trúc.

Khi valueForKey: đã xác định phương thức truy nhập cụ thể hoặc biến mẫu được sử dụng để cung cấp giá trị cho khóa được chỉ định, nó sẽ kiểm tra kiểu trả về hoặc kiểu dữ liệu. Nếu giá trị được trả về là không phải là một đối tượng, đối tượng NSNumber hoặc NSValue được tạo cho giá trị đó và được trả lại tại vị trí đó.

Tương tự, setValue:forKey: xác định loại dữ liệu được yêu cầu bởi biến truy cập hoặc biến mẫu thích hợp cho khóa được chỉ định. Nếu loại dữ liệu không phải là một đối tượng, thì giá trị được trích xuất từ ​​đối tượng được thông qua bằng phương pháp thích hợp -<type>Value.

Vì vậy, trong trường hợp của bạn, intValue được áp dụng tự động cho qua NSNumber đối tượng, và các số nguyên kết quả được truyền cho setVoltage:.

4

Bạn chính xác trong trường hợp bạn đang tạo một phiên bản NSNumber và chuyển trường đó. Nhưng, bạn đang chuyển nó đến setValue:forKey: và nó đang làm một số công việc cho bạn.Nó đang tìm phương thức setter thích hợp cho voltage (setVoltage:), kiểm tra kiểu dữ liệu và unboxing số đó thành int trước khi gọi setter.

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