2011-09-06 75 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

委托方法*将被调用,但是当设置委托时编译器无法检查所述对象是否符合所需的协议,您将从编译器中收到警告。 –