2009-05-22 32 views
9

Sự hiểu biết của tôi là các giao thức giống như giao diện bằng các ngôn ngữ khác - chúng khai báo các phương thức dự kiến ​​- trong khi các danh mục cho phép bạn thêm các phương thức mới vào các kiểu hiện có (có lẽ ngay cả các kiểu bạn không sở hữu.)Tại sao iPhone SDK sử dụng các danh mục, thay vì giao thức, đối với một số đại biểu?

Tại sao, sau đó , SDK iPhone đôi khi có sử dụng các danh mục để khai báo các loại đại biểu không? Thông thường tôi sẽ mong đợi tất cả các đại biểu được gõ id <MyDelegateProtocol> nhưng có rất nhiều ví dụ mà đây không phải là trường hợp.

Ví dụ: xem NSURLConnection. Đại biểu của nó được gõ "id" và "hợp đồng" được khai báo là một thể loại trên NSObject (NSURLConnectionDelegate).

Vì vậy: động lực để sử dụng danh mục trong những trường hợp này là gì?

Trả lời

13

Mục tiêu-C 2.0 đã giới thiệu chỉ thị giao thức @optional, cho phép bạn khai báo các phương thức giao thức nhất định là tùy chọn. Trước Obj-C 2.0, các danh mục được sử dụng để cho phép các phương thức đại biểu tùy chọn (cụ thể là các danh mục trên NSObject, được gọi là các giao thức không chính thức).

Đoán của tôi là hầu hết việc sử dụng danh mục thay vì giao thức trong SDK iPhone là sự lưu giữ từ các lớp Mac tương đương. Ví dụ: NSURLConnection tồn tại trong cả Mac và iPhone SDK, vì vậy mã có thể được chia sẻ. Kể từ khi Apple chưa trải qua để thay đổi tất cả các lớp học Mac để sử dụng các giao thức chính thức, chúng tôi còn lại với một phần của một sự không thống nhất.

+0

Đó là phỏng đoán của tôi nhưng tôi không biết chắc chắn. Cảm ơn! –

+0

Mong đợi để xem sự thay đổi giao thức đi kèm khá sớm, mặc dù. Bây giờ các phương thức giao thức tùy chọn được cho phép, sử dụng chúng sẽ dọn sạch mã một chút và loại bỏ rất nhiều loại không cần thiết hiện nay. (Chúng thật tuyệt và tất cả, nhưng thay vì sử dụng các phương pháp tacking trên NSObject trong thời gian chạy, tôi nghĩ có một đại biểu thực hiện một giao thức là sạch hơn, cả về khái niệm lẫn quan điểm thời gian chạy.) –

4

Cho đến khi sửa đổi Mục tiêu-C được triển khai với OS X 10.5 và SDK iPhone, được gọi là "Mục tiêu-C 2.0", người ta chỉ có thể thực hiện các giao thức tùy chọn bằng cách sử dụng danh mục. Trong mục tiêu-C 2.0, một từ khóa @optional mới đã được thêm vào trong các giao thức để đánh dấu phương thức nào là tùy chọn (phần còn lại được yêu cầu ngầm).

Vì vậy, tôi nghĩ rằng những gì bạn thấy là sự tạm dừng nhẹ so với những ngày trước trước từ khóa @optional.

Chỉnh sửa: Để trả lời phần tiếp theo xuất hiện trong câu hỏi gốc: Động lực sử dụng danh mục trên NSObject/id cho giao thức không chính thức là một phần tài liệu và nhóm các phương thức mà đối tượng có thể gọi trong nguồn dữ liệu của nó (hoặc đại biểu hoặc bất cứ điều gì), và đến một mức độ thấp hơn để tránh cảnh báo trình biên dịch mà bạn đang gọi phương pháp mà trình biên dịch không biết sẽ có mặt trong đối tượng nhận được cuộc gọi. Hãy tưởng tượng là người thực hiện lớp gọi các phương thức nguồn dữ liệu này - bạn có thể muốn kiểm tra xem phương thức có hiện diện không bằng cách sử dụng [obj respondsToSelector: @selector (my: datasource: method :)] bất cứ khi nào bạn muốn gọi : datasource: method: phương thức obj đối tượng.

+0

Làm cho cảm giác - cảm ơn! –

1

Đó là di sản đến từ mục tiêu-c 1.0, không có "phương thức giao thức tùy chọn".

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