2013-01-31 18 views
10

Ilekroć utworzyć startowy, który ma delegat zgodne z protokołem piszę init jak to:startowych z protokołem delegata

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

ten sposób będę miał ostrzeżenie jeśli tworząc obiekt nie jest zgodny z protokół.

Jednak zauważyłem, że metoda tj UIAlertView startowych wygląda następująco:

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

Delegat argumentem nie precyzuje aby były zgodne z protokołem UIAlertViewDelegate? Jakieś wskazówki, dlaczego Apple zrobił to w ten sposób?

+0

Myślałem, że byli zbyt leniwi, aby to dodać, lub może dlatego, że wszystkie metody UIAlertViewDelegate są opcjonalne, nie ma znaczenia, czy delegat jest zgodny z protokołem czy nie. – howanghk

+0

nie przyniosłoby to żadnych korzyści w tym przypadku, byłoby tylko dodatkowym trudem dostosowanie protokołu do twoich zajęć. – holex

Odpowiedz

1

Moje zrozumienie jest, że API był wielki bałagan kilka lat temu i nadal są one ustalające wszystkie te problemy.

Należy pamiętać, że do niedawna wiele protokołów było nieformalnych i prawie wszędzie w interfejsie API można było znaleźć tylko delegatów jako id. Apple naprawia go krok po kroku w każdej wersji, na przykład oficjalni wydawcy z NSURLConnection pochodzą z iOS 6.0. Możesz też zauważyć, że w systemie iOS 6.1 niektóre typy zwracanych id zostały zmienione na instancetype.

Cóż, to była moja pierwsza myśl, po sprawdzeniu plików nagłówkowych:

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

To oczywiste, że ktoś chciał dodać protokół z deklaracjami, ale dodał, tylko komentarz. Zgaduję, że zostawili go bez protokołu zgodności.

4

Dobre pytanie! Robię to samo, mając nadzieję na złapanie kolejnych błędów podczas kompilacji.

Wygląda na to, że Apple spełnia swoje własne standardy; jak podano w Concepts in Objective-C:

celu realizacji delegata dla swojej klasy niestandardowej, należy wykonać następujące czynności:

Zadeklaruj metody dostępowe powierzać pliku klasa nagłówka.

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

Wdrożenie metody dostępowe. W programie zarządzanym pamięcią, aby uniknąć cykli zatrzymania, metoda ustawiająca nie powinna zatrzymywać ani kopiować delegata.

- (id)delegate { 
    return delegate; 
} 

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

Chociaż jeśli zaznaczysz UITableView.h możesz zobaczyć '@property (nonatomic, assign) id delegate;' więc oni wydają się mieszać to :-) –

Powiązane problemy