Протоколы в iPhone SDK - PullRequest
       15

Протоколы в iPhone SDK

1 голос
/ 02 марта 2010

Я запутался в конце @protocol ---- @ в iphone, для чего он на самом деле предназначен Почему мы используем это. Это функциональность, чтобы обеспечить дополнительные методы для класса? я не уверен.

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

Спасибо

Shibin

Ответы [ 4 ]

9 голосов
/ 02 марта 2010
Протокол

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

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

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

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

6 голосов
/ 02 марта 2010

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

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

@interface MyClass: NSObject <Printable> { ... }
// MyClass extends NSObject implements Printable
5 голосов
/ 02 марта 2010
Протокол

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

Например:

@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 голосов
/ 17 февраля 2011

Лучше использовать что-то вроде

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...