2013-01-31 128 views
10

每當我創建一個具有委託符合協議的初始化我寫的初始化,因爲這:初始化與委託協議

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

這樣,我將有一個警告,如果創建的對象不符合協議。

但是我注意到,即UIAlertView init方法是這樣的:

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

委託參數沒有指定符合UIAlertViewDelegate協議?任何線索爲什麼蘋果這樣做?

+0

我以爲他們只是懶得補充一點,還有可能是因爲所有的UIAlertViewDelegate方法是可選的,它不一樣,如果委託符合協議或沒有關係。 – howanghk

+0

在這種情況下它不會帶來任何好處,將協議與您的課程相一致將會帶來額外的痛苦。 – holex

回答

1

我的理解是,API弄得一塌糊塗,幾年前,他們還在修復所有這些問題。

注意,直到最近,許多協議是非正式和API中幾乎無處不在,你可以找到代表僅作爲id。蘋果正在每個版本中逐步修復它,例如正式的NSURLConnection代表隨附iOS 6.0。或者請注意,在iOS 6.1中,某些id返回類型已更改爲instancetype

好了,這是我最初的想法,檢查頭文件後:

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

很明顯有人想的協議添加到聲明,但只加了註釋。我猜測他們離開它沒有兼容性協議。

4

好問題!我也在做同樣的事情,希望在編譯時捕獲更多的錯誤。

蘋果似乎符合自己的標準;在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 delegate;'所以它們似乎混淆了:-) –