2013-01-31 5 views
10

Всякий раз, когда я создаю инициализации, который имеет делегат в соответствии с протоколом, я пишу инициализации, как это:INIT с протоколом делегата

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

Таким образом, у меня будет предупреждение, если создание объекта не соответствует к протокол.

Однако я заметил, что есть UIAlertView метод инициализации выглядит следующим образом:

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

Делегат аргумент не указывает, в соответствии с протоколом UIAlertViewDelegate? Какие-нибудь подсказки, почему Apple сделала это именно так?

+0

Я думал, что они просто слишком ленивы, чтобы добавить это, или может быть, потому что все методы UIAlertViewDelegate являются необязательными, неважно, соответствует ли делегат протоколу или нет. – howanghk

+0

, это не принесло бы никакой пользы в этом случае, это было бы просто дополнительной болью для соответствия протокола вашим классам. – holex

ответ

1

Я понимаю, что API был большой беспорядок несколько лет назад, и они все еще фиксируя все эти вопросы.

Обратите внимание, что до недавнего времени многие протоколы были неформальными и почти везде в API, вы могли найти делегатов только как id. Apple исправляет его шаг за шагом в каждой версии, например, официальные NSURLConnection делегаты поставляются с iOS 6.0. Или обратите внимание, что в iOS 6.1 некоторые из возвращаемых типов id были изменены на instancetype.

Ну, это была моя первая мысль, после проверки файлов заголовков:

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

Это очевидно, кто-то хотел, чтобы добавить протокол к декларациям, но добавил только комментарий. Я предполагаю, что они оставили его без протокола для совместимости.

4

Хороший вопрос! Я делаю то же самое в надежде поймать больше ошибок во время компиляции.

Apple, по-видимому, соответствует их собственным стандартам; как указано в Concepts in Objective-C:

Для реализации делегата для пользовательского класса, выполните следующие действия:

Объявляет методы доступа делегата в файле заголовка класса.

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

Реализовать методы доступа. В управляемой памятью программе, чтобы избежать циклов сохранения, метод setter не должен сохранять или копировать делегата.

- (id)delegate { 
    return delegate; 
} 

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

Хотя если вы проверите UITableView.h, вы увидите делегат '@property (nonatomic, assign) id , поэтому они, кажется, смешивают его :-) –

Смежные вопросы