2010年5月9日日曜日

プロトコル

AVAudioPlayerクラスを使用する時に、少しプロトコルについて説明しました。
プロトコルとは、C++、C#の「仮想関数」に似たものであることを説明しました。
プロトコルの定義をxcodeでAVAudioPlayerDelegateプロトコルの「定義へジャンプ」で定義を見てみると、以下のようになっていました。


@protocol AVAudioPlayerDelegate
@optional
/* audioPlayerDidFinishPlaying:successfully: is called when a sound has finished playing. This method is NOT called if the player is stopped due to an interruption. */
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;

/* if an error occurs while decoding it will be reported to the delegate. */
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error;

#if TARGET_OS_IPHONE
/* audioPlayerBeginInterruption: is called when the audio session has been interrupted while the player was playing. The player will have been paused. */
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player;

/* audioPlayerEndInterruption: is called when the audio session interruption has ended and this player had been interrupted while playing.
The player can be restarted at this point. */
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player;
#endif
@end



「@protocol」〜「@end」までが「プロトコル」の定義です。
プロトコルには上記のようにメソッド宣言が並べられているだけです。
以前AVAudioPlayerクラスを利用した時に実装した関数はここで宣言されています。
ここで注目してほしい所は、「@optional」という記述です。
「@optional」がある場合、ここで宣言されたメソッドは実装してもしなくても良いという意味になります。
以前AVAudioPlayerを利用した時にメソッドの宣言は無くてもかまわないと書きましたが、プロトコル内に「@optional」が記載されていたから実装が無くても構わなかったわけです。

逆にプロトコル内で必ず実装しなければならないメソッドを宣言する時は、「@required」と記載します。

0 件のコメント:

コメントを投稿