2010-03-02 5 views
1

Я смущен о @protocol ---- @ end в iphone, на самом деле это означает. Почему мы это используем. Является ли это функциональностью для предоставления дополнительных методов классу ..? я не уверен.Протоколы в iPhone SDK

Пожалуйста, помогите мне.

Спасибо,

Шибинь

+0

См. Также этот вопрос: http://stackoverflow.com/questions/1913935/what-are-the-arrow-brackets-in-an-obj-c-class-interface-for –

ответ

9

протокол используется для объявления функции, которая собирается использоваться многими объектами или классами.

Рассмотрим пример, вы разрабатываете базу данных о птицах. Таким образом, у вас будет птица как базовый класс, и вы унаследуете птицу, чтобы создать свою собственную птицу. поэтому в классе птиц у вас не будет никаких определений, кроме некоторых видов поведения, которые все птицы должны будут наследовать. Как птицы могут летать, есть такие крылья. Итак, что вы будете делать, вы объявите все эти поведения и реализуете их в своих производных классах. Потому что могут быть птицы, которые летают высоко и на большие расстояния, а некоторые летают на короткие расстояния.

Для этой цели используется @protocol. Используя @protocol, вы объявляете о некоторых поведении. И используйте эти поведения в своих других классах для реализации поведения.

Это позволит избежать накладных расходов при объявлении того же метода снова и снова и гарантирует, что вы реализуете поведение в своем классе.

+0

Thats a nice post .. и ясное объяснение спасибо много –

6

@protocol эквивалентно интерфейса в Java.

@protocol Printable // Printable interface 
- (void) print; 
@end 

@interface MyClass: NSObject <Printable> { ... } 
// MyClass extends NSObject implements Printable 
5

@protocol может использоваться для определения делегата.

Например:

@protocol SomeDelegate 
- (void)delegateActionCompleted; 
@end 

@interface MyClass: NSObject { 
    id<SomeDelegate> _delegate; 
} 
@end 

, а затем реализации (.m) Файл:

@implementation MyClass 

- (void)performAction { 
    // do the actual work 
    if (self._delegate && [self._delegate respondsToSelector:@selector(delegateActionCompleted)]) { 
     [self._delegate delegateACtionCompleted]; 
    } 
} 
@end 
0

Это должно быть лучше использовать что-то вроде

if (self.delegate && [self.delegate conformsToProtocol:@protocol(YourProtocolName)]) { 
    ... 
} 

проверить, является ли делегат на самом деле в соответствии с указанным протоколом.