2011-01-14 34 views
5

Tôi đang nghiên cứu một số khái niệm cơ bản về giao thức không chính thức và giao thức thực. Điều làm tôi bối rối là, Cocoa dường như sử dụng rất nhiều giao thức không chính thức trên NSObject. Các giao thức không chính thức này là các loại trên NSObject khai báo các phương thức, nhưng không thực sự thực hiện chúng. Theo như tôi hiểu đúng, lý do duy nhất họ sử dụng các giao thức không chính thức (nói cách khác, các danh mục trên NSObject không cung cấp phương pháp triển khai phương pháp), là đưa ra gợi ý tự động hoàn thành trong Xcode.Sự khác nhau giữa việc sử dụng giao thức không chính thức trên NSObject hoặc giao thức với các phương thức tùy chọn là gì?

Một ví dụ là phương thức -awakeFromNib được định nghĩa trong NSNibLoading.h, là giao thức không chính thức trên NSObject. Hệ thống tải nib kiểm tra thời gian chạy nếu một đối tượng thực hiện phương thức đó. Nếu có, thì nó gọi nó.

Nhưng bây giờ, hãy tưởng tượng không có tính năng nào được gọi là giao thức không chính thức. Phương án thay thế có cùng tác dụng chính xác sẽ là một khai báo @protocol thực sự khai báo phương thức tùy chọn -awakeFromNib. NSObject sẽ chỉ chấp nhận giao thức đó và trình biên dịch sẽ vui vẻ cung cấp tự động hoàn thành.

Có ai có thể chỉ ra sự khác biệt lớn giữa hai chiến lược này không? Tôi không thấy điểm giao thức không chính thức nhưng thực sự muốn làm như vậy.

Trả lời

7

Hai sự khác biệt rất lớn:

  1. Compile loại thời gian kiểm tra. Một giao thức rõ ràng với các phương thức tùy chọn rõ ràng hơn nhiều về những phương thức mà bạn có thể thực hiện. Cả hai đều sử dụng một cách rõ ràng lớp với giao thức mà nó tuân thủ, và Xcode có thể cung cấp danh sách hoàn thành mã chính xác hơn nhiều về những gì bạn có thể thực hiện.

  2. Nó giữ NSObject gọn gàng. Với giao thức không chính thức kiểu cũ, tất cả các phương pháp là tùy chọn thay vì thường có triển khai mặc định thực hiện được thêm vào NSObject.

Giao thức không chính thức nơi giải pháp gọn gàng cho vấn đề không còn tồn tại kể từ khi giới thiệu phương pháp tùy chọn trong giao thức trong Mục tiêu-C 2.0.

+0

Tôi hiểu. Các giao thức không chính thức đến từ quá khứ mà không có phương thức giao thức tùy chọn nào. Điều này có ý nghĩa. –

+0

Tôi đã cập nhật câu trả lời của mình cũng nêu rõ rằng các giao thức không chính thức là một sản phẩm của di sản. – PeyloW

1

Để sử dụng một giao thức, bạn sẽ phải nhập nó, và để cho các đối tượng bạn đang mã hóa trong phù hợp với nó

TestViewController : UIViewController <MyAwesomeProtocol> 

Để cho một thể loại được sử dụng, bạn không cần phải làm những điều như vậy, bạn có thể chỉ cần nhập danh mục (thậm chí không cần thiết trong mọi trường hợp) và sử dụng đối tượng (trong trường hợp của tôi là UIViewController) như bạn thường xuyên, và XCode sẽ cung cấp cho bạn khả năng tự động hoàn thành cho các phương thức thể loại.

Tôi thích cách giao thức, nó nghiêm ngặt và đáng tin cậy hơn. Các danh mục có xu hướng gây ra các vấn đề về xây dựng và có một chút kỳ quặc (trong hầu hết, không phải tất cả, các trường hợp) phải trung thực.

+0

Các vấn đề về xây dựng nào? –

+0

Có những trường hợp bạn sử dụng kết hợp các thư viện hoặc thậm chí tự biên dịch một thư viện và các danh mục có xu hướng đi theo tường.Tôi không có một ví dụ rõ ràng tại thời điểm này, nhưng tôi biết rằng khuôn khổ ba20 gây ra các loại vấn đề trong dự án của chúng tôi vì các loại. Không phải là một fan hâm mộ lớn. – Jake

3

Điểm khác biệt lớn nhất là từ khóa @optional chỉ được giới thiệu cách đây vài năm. Đối với mã mới, các giao thức không chính thức về cơ bản là lỗi thời. Phần lớn khung công tác là mã không phải mới.

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