iOS開発のprotocolとdelegate


プロトコール——協議
プロトコルは、オブジェクトの属性、挙動、およびコールバックを定義するために使用されます。    合意には二つのキーワード@prvateと@optionalがあります。@prvateはこのプロトコルを使うために書かなければならない方法を表しています。@optionalはオプションの方法を表しています。使わなくてもいいです。書かなくてもいいです。UITable Viewのように、二つのプロトコルがあります。UITable View DelegateとUITable View DataSource、UItable View Delegateは動作動作を規定しています。中の方法は全部オプションの方法です。UITable View DataSourceはデータ記憶構造を規定しています。二つの方法があります。したがって、UITable View DataSourceを実現するには、この二つの方法を定義しなければなりません。そうでないと、プログラムが間違ってしまいます。応答のクラスまたはコントロールが使用されている場合、このクラスがプロトコルを定義すれば、必要に応じてプロトコルが実行されます。
protocol java interface     , Objective-C      。
protocol
@protocol ClassADelegate
 
- (void)methodA;
- (void)methodB;
 
@end
は、 のセットを しています。この を に することをプロトコールといいます。つまりプロトコルです。 は される がありますので、クラスについては の
@interface ClassB <ClassADelegate> {
}
@end
をClass B conform to protocol Class ADelegateといいます。つまり、クラスBがこのプロトコルを したということです。 のヘッダファイルがあれば、unrecognized selector sent to instanceのようなエラーが する なく、
ClassB *b = [[ClassB alloc] init];
[b methodA];
[b methodB];
を び すことができます。したがって、プロトコールとは、グループの であり、クラス から されたグループの である。
id<ClassADelegate> b = ...;
[b methodA];
このような い もよくあります。bはidタイプです。Class ADelegateという の を っています。
delegate——  ,  
 
 A   B,   B    A      ,    delegate
          ,              (protocal)

  :ClassA.h
#import <Foundation/Foundation.h>
#import "ClassB.h"
@interface ClassA : NSObject<SampleProtocal>
- (void)test;
@end


  :ClassA.m
#import "ClassA.h"
@implementation ClassA


-(void)test{
    ClassB *classB = [[ClassB alloc] init];
    classB.delegate = self;
    
    [classB actionOfClassB];
}


-(void)callback{
    NSLog(@"       B  ");
}
@end


  :ClassB.h
#import <Foundation/Foundation.h>

@protocol SampleProtocal <NSObject>
@required
- (void)callback;
@end


@interface ClassB : NSObject{
    id<SampleProtocal> delegate;
}
@property (nonatomic, retain) id<SampleProtocal> delegate;


- (void)actionOfClassB;


@end


  :ClassB.m
#import "ClassB.h"


@implementation ClassB
@synthesize delegate;
-(void)actionOfClassB{
    [delegate callback];
}
@end