2013-01-31 46 views
10

Bất cứ khi nào tôi có thể tạo một init mà có một đại biểu phù hợp với một giao thức tôi viết init như thế này:init với giao thức đại biểu

- (id)initWithDelegate:(id<ProtocolToConform>)delegate; 

Bằng cách này tôi sẽ có một cảnh báo nếu đối tượng tạo không phù hợp với các giao thức.

Tuy nhiên tôi nhận thấy rằng ví dụ phương pháp UIAlertView init trông như thế này:

- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... 

Đối số đại biểu không chỉ định để phù hợp với các giao thức UIAlertViewDelegate? Bất kỳ manh mối nào tại sao Apple đã làm theo cách đó?

+0

Tôi nghĩ rằng chúng quá lười để thêm vào đó, hoặc có thể là do tất cả các phương thức UIAlertViewDelegate là tùy chọn, không quan trọng nếu đại biểu có tuân theo giao thức hay không. – howanghk

+0

nó sẽ không đưa ra bất kỳ lợi ích nào trong trường hợp này, nó sẽ chỉ là một nỗi đau thêm để tuân theo giao thức cho các lớp học của bạn. – holex

Trả lời

1

sự hiểu biết của tôi là API là một mớ hỗn độn lớn cách đây vài năm và họ vẫn đang sửa chữa tất cả các vấn đề này.

Lưu ý rằng cho đến gần đây, nhiều giao thức không chính thức và hầu như ở mọi nơi trong API, bạn chỉ có thể tìm thấy đại biểu là id. Apple đang sửa nó từng bước trong mọi phiên bản, ví dụ như các đại biểu chính thức là NSURLConnection đại diện đi kèm với iOS 6.0. Hoặc lưu ý rằng trong iOS 6.1, một số loại trả về id đã được đổi thành instancetype.

Vâng, đây là ý tưởng ban đầu của tôi, sau khi kiểm tra các tập tin tiêu đề:

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate

Nó ai đó rõ ràng muốn thêm các giao thức cho các Tờ khai nhưng nói thêm chỉ nhận xét. Tôi đoán họ đã bỏ nó mà không có giao thức để tương thích.

4

Câu hỏi hay! Tôi làm điều tương tự với hy vọng bắt được nhiều lỗi hơn vào thời gian biên dịch.

Apple dường như tuân thủ các tiêu chuẩn của riêng họ; như đã nêu trong Concepts in Objective-C:

Để thực hiện một đại biểu cho lớp tùy chỉnh của bạn, hoàn tất các bước sau:

Khai báo các phương pháp accessor đại biểu trong tập tin tiêu đề lớp học của bạn.

- (id)delegate; 
- (void)setDelegate:(id)newDelegate; 

Thực hiện các phương pháp accessor. Trong một chương trình được quản lý bộ nhớ, để tránh các chu kỳ giữ lại, phương thức setter không nên giữ lại hoặc sao chép ủy nhiệm của bạn.

- (id)delegate { 
    return delegate; 
} 

- (void)setDelegate:(id)newDelegate { 
    delegate = newDelegate; 
} 
+0

Mặc dù nếu bạn kiểm tra UITableView.h bạn có thể thấy '@property (nonatomic, assign) id delegate;' để chúng dường như trộn nó lên :-) –

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