2016-11-24 30 views
22

Sự khác nhau giữa việc đánh dấu một phương thức là @objc vs dynamic là gì, khi nào bạn sẽ làm một cái so với cái kia?Swift 3 - dynamic vs @objc

Dưới đây là định nghĩa của Apple về động.

động Áp dụng công cụ sửa đổi này cho bất kỳ thành viên nào của lớp có thể là được đại diện bởi Mục tiêu-C. Khi bạn đánh dấu tuyên bố thành viên bằng công cụ sửa đổi động, quyền truy cập vào thành viên đó luôn được động được gửi đi bằng thời gian chạy Objective-C. Truy cập vào thành viên đó là không bao giờ được trình biên dịch hoặc biên dịch sai.

Vì các khai báo được đánh dấu bằng công cụ sửa đổi động được gửi đi sử dụng thời gian chạy Objective-C, chúng được đánh dấu hoàn toàn bằng thuộc tính objc .

+0

Câu hỏi của bạn đã được trả lời chưa? – Alexander

Trả lời

26

Một hàm/biến được khai báo là @objc có thể truy cập từ Objective-C, nhưng Swift sẽ tiếp tục truy cập trực tiếp thông qua công văn tĩnh hoặc ảo. Điều này có nghĩa là nếu hàm/biến bị chuyển qua khung Objective-C, giống như những gì xảy ra khi sử dụng Key-Value Observing hoặc các Objective-C APIs khác nhau để sửa đổi lớp, gọi phương thức từ Swift và Objective-C sẽ tạo ra các kết quả khác nhau .

Sử dụng dynamic yêu cầu Swift luôn tham chiếu đến công cụ động Objective-C. Điều này là cần thiết cho những thứ như Quan sát giá trị chính để hoạt động chính xác. Khi hàm Swift được gọi, nó đề cập đến thời gian chạy Objective-C để tự động gửi cuộc gọi.

+0

Tôi không biết KVO đang bị xáo trộn, bạn có thể giải thích về điểm này không? – Boon

+2

@Boon KVO tạo một lớp con động, thay thế thuộc tính của bạn bằng một lớp được bao bọc trong các cuộc gọi willChangeValueForKey/didChangeValueForKey, trừ khi automaticNotifiesObserversForKey được sử dụng để chọn không tham gia. – kevin

6

Khi báo giá đó cho biết, dynamic ngụ ý @objc.

Trừ khi bạn chỉ định một lớp là dynamic, trình biên dịch miễn phí để tối ưu hóa và nội tuyến các phương pháp của nó. Điều này mang lại lợi ích hiệu suất rất lớn, nhưng nó có nghĩa là bạn không thể thay đổi những triển khai phương thức đó trong thời gian chạy. Nếu bạn đang lập kế hoạch lộn xộn xung quanh với các phương thức đó trong thời gian chạy bằng cách sử dụng các khả năng phản chiếu của thời gian chạy Objective C, bạn sẽ cần phải sử dụng dynamic. Bạn sẽ phải chịu một hình phạt hiệu suất (mã của bạn sẽ chạy ở mức độ Objective C tốc độ, chứ không phải là gần mức C), nhưng bạn sẽ đạt được thêm năng động.