2011-04-05 12 views
11

Tôi quan tâm đến cách gõ động trong Objective-C hoạt động. Tôi đã nghiên cứu loại "id", tôi biết nó làm gì và cách sử dụng nó, nhưng tôi tò mò ... Làm thế nào để chức năng này được thực hiện dưới mui xe?Nhập động, Mục tiêu-C, hoạt động như thế nào?

Bạn không thể xác định/giải quyết bất cứ điều gì trong thời gian biên dịch, chỉ trong thời gian chạy. Tôi đoán nó có thể chỉ đơn giản là chỉ đến byte đầu tiên của một số đối tượng trong bộ nhớ, nhưng làm thế nào là chữ ký lớp được lưu trữ? Làm thế nào để nó biết nó đang hướng tới cái gì và nó thực hiện các getters khác nhau như thế nào cho lớp của đối tượng nhọn?

Trả lời

15

"Dưới mui xe", để nói, tất cả các đối tượng Objective-C là cấu trúc C với một con trỏ đến đối tượng Lớp đại diện cho loại của chúng. Một id là một con trỏ đến struct cơ bản nhất như vậy, mà trông giống như sau:

struct objc_object { 
    Class isa; 
} 

id được xử lý đặc biệt bởi trình biên dịch, trong đó trình biên dịch không cung cấp cho bạn bất kỳ cảnh báo rằng các đối tượng có thể không đáp ứng cho bất kỳ bộ chọn nào giống như khi bạn sử dụng biến được nhập mạnh mẽ hơn.

Khi bạn gọi một phương thức trên đối tượng bất kỳ, nó theo sau đó isa con trỏ đến đối tượng Lớp và tìm đối tượng Lớp đó để tìm hàm triển khai cho bộ chọn của phương pháp bạn đã cố gắng gọi.

+0

Tuyệt vời, cảm ơn bạn đã trả lời! Nhiều nghĩa vụ! – Curiosity

7

Để thêm vào câu trả lời của Anomie, cách lớp lưu trữ bảng trả lời thư và bit mã nào mà các thư đó gọi là hoàn toàn mờ đục. Vì vậy, có một mức độ mà không ai có thể trả lời chính xác cách thức hoạt động của Apple hoạt động, và nó gần như chắc chắn khác với triển khai của GNU.

Tuy nhiên, Apple Objective-C Runtime Reference giải thích mọi thứ mà thời gian chạy có thể thực hiện, ở cấp C. Vì vậy, bạn có thể thấy có những hoạt động nào có thể để thiết lập và tìm kiếm mọi thứ. Đó là một hệ thống tương đối đơn giản dưới mui xe, chủ yếu chỉ là một loạt các từ điển (theo ý nghĩa không bị ảnh hưởng) ánh xạ một thứ khác, chẳng hạn như từ một bộ chọn đến một con trỏ hàm IMP. Nếu có một mục trong bảng cho một lớp cụ thể thì điều có liên quan được gọi. Nếu không thì các siêu lớp được kiểm tra, cơ chế dự phòng tiêu chuẩn forwardingTargetForSelector: được xem xét, v.v.

Ngoài ra, các nhận xét cụ thể hơn yêu cầu các câu hỏi cụ thể hơn. Có rất nhiều chi tiết như quan sát giá trị quan trọng đó đạt được bằng một phương thức swizzle (do đó, thời gian chạy điều chỉnh con trỏ C mà lớp sẽ gọi cho setter là một cái gọi là setter thực và thông báo cho bất kỳ ai đang quan sát), nhưng tất cả chúng chỉ là cách sử dụng cụ thể của thời gian chạy như được ghi lại.

+0

Giải thích tốt đẹp, nhiều nghĩa vụ! – Curiosity