2011-09-06 48 views
2

我想知道是否需要聲明協議。需要在目標c中聲明協議嗎?

因此,我刪除了協議聲明代碼的一部分。

我認爲它會發生編譯錯誤。

但是,一直運行沒有任何問題。

爲什麼需要協議聲明部分?

#import <UIKit/UIKit.h> 


@interface SingleComponentPickerViewController : UIViewController { 
// <UIPickerViewDelegate, UIPickerViewDataSource> { ==> protocol declare part 
    IBOutlet UIPickerView *singlePicker; 
       NSArray *pickerData; 
} 
@property (nonatomic, retain) UIPickerView *singlePicker; 
@property (nonatomic, retain) NSArray *pickerData; 
- (IBAction)buttonPressed:(id)sender; 
@end 


<UIPickerViewDelegate, UIPickerViewDataSource> <= this is what feature? 
                When omit this, excute without any problem. 

下面是圖片編譯後的畫面。

它沒有問題。

,沒有任何問題EXCUTE ..

enter image description here

回答

1

您在這裏沒有聲明協議,您只是指定您的類SingleComponentPickerViewController遵循您指定的協議。

如果您使用任何組件並將SingleComponentPickerViewController設置爲其代表,則需要指定該協議。這是因爲編譯器知道你的類遵循了特定的協議,並且你已經實現了任何需要的協議方法。

0
<UIPickerViewDelegate, UIPickerViewDataSource> 

它不聲明的協議,它告訴你類遵循於上市協議的編譯器。

這是必要的,所以其他類可以知道你的類符合他們的協議。如果省略它們,則不會出現編譯器錯誤,但可能不會調用在類中聲明的委託方法。

+0

它運行沒有任何問題相同的不省略代碼。 –

+1

委託方法*將被調用,但是當設置委託時編譯器無法檢查所述對象是否符合所需的協議,您將從編譯器中收到警告。 –