2016-05-19 38 views
11

Trong ObjC, nó được sử dụng Messaging, static binding, dynamic typing, dynamic binding, dynamic method resolution, dynamic loading, introspector và vân vân.như thế nào iOS Swift Runtime làm việc

Quan trọng, phương pháp cốt lõi objc_msgSend chịu trách nhiệm lấy bộ chọn bạn đang gửi và đối tượng bạn đang gửi đến và tìm kiếm trong bảng phương thức lớp để tìm ra chính xác đoạn mã nào được yêu cầu xử lý nó.

mối quan tâm của tôi ở đây là:

  1. Swift làm điều gì đó tương tự như ObjC trên thời gian chạy?

  2. Làm cách nào để Swift runtime tìm mã triển khai cho một số phương pháp đối tượng/lớp?

  3. Trong ObjC, classesobjects được biên soạn một số runtime types như C struct trên runtime. Sau đó, classesobjects được biên dịch cho thời gian chạy là gì ở Swift?

  4. Swift runtime có thứ gì đó như class/meta class/isa pointer/super pointer?

+0

Bạn có thể đưa ra ví dụ không? – ozgur

+0

@Boris Điều tôi trả lời có liên quan đến # 1 & # 2. Về # 3 & # 4 Tôi chắc chắn rằng Swift chắc chắn có điều gì đó nhưng điều đó không ổn định. Ban đầu đã có kế hoạch ổn định ABI trong bản phát hành Swift 3.0, nhưng máy bay được thay đổi: https://www.infoq.com/news/2016/05/swift-3-no-stable-abi –

Trả lời

12

Trong ngắn hạn, có các kiểu gọi phương thức động và tĩnh.

  1. Tĩnh - địa chỉ hàm được gọi được xác định trong thời gian biên dịch, do đó chi phí của cuộc gọi như vậy tương tự như gọi hàm C. Cơ chế này được sử dụng cho các phương thức private hoặc final phương thức gửi đi cuộc gọi.

  2. Điều động động là chủ nghĩa mechin cho phép triển khai khái niệm đa hình của OOP - địa chỉ hàm được gọi được xác định trong thời gian chạy. Swift có hai kiểu con của nó:

2.1. Obj-C - bạn đã mô tả trong câu hỏi. Cơ chế này được sử dụng khi đối tượng kế thừa từ NSObject hoặc phương thức gọi có tiền tố @objc.

2.2. Dựa trên bảng ảo (như trong C++) - có các bảng chứng kiến ​​tương tự. Những gì nó làm trong khi gọi phương thức gửi đi chỉ là phép tính số học đơn - tính toán địa chỉ hàm thực tế dựa trên hàm offset trong bảng nhân chứng của lớp cơ sở và vị trí bảng nhân chứng của lớp đối tượng. Đó là một hoạt động tương đối rẻ so với Obj-C. Nó giải thích tại sao Swift "thuần túy" xấp xỉ với hiệu năng C++.

Nếu bạn không đánh dấu phương pháp với private từ khóa hoặc lớp học của bạn không phải là final và cùng một lúc bạn lớp là "thuần túy" Swift (nó không kế thừa NSObject) thì cơ chế dựa trên bảng ảo này được sử dụng. Nó có nghĩa là tất cả các phương pháp theo mặc định là virtual.

P.S. liên kết hữu ích cho minh tầm nhìn của tôi về "Các loại":

https://developer.apple.com/swift/blog/?id=27

"phân nhóm" giải thích được dựa trên hiểu biết của tôi.

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