Objective-C 自前でデリゲートを作る

自前で作ったクラスでデリゲートさせる

既存のクラスにデリゲートを呼んでもらったことあるけど、
自分でも呼んでみたーい。

5回メソッドが呼ばれるとコールバックしてあげるよ

doMethodが5回よばれたら、callThisMethodメソッド呼ぶから準備してね。ってーソースを作ることにした。

FiveTimeDo.h

#import <Foundation/Foundation.h>

@protocol FiveTimeDoDelegate <NSObject>
-(void) callThisMethod;
@end

@interface FiveTimeDo : NSObject {
    id <FiveTimeDoDelegate> delegate;
    NSInteger *i;
}

@property (retain, nonatomic) id <FiveTimeDoDelegate> delegate;

-(void) setMyDelegate:(id <FiveTimeDoDelegate>)d;
-(void) doMethod;
@end

FiveTimeDo.m

#import "FiveTimeDo.h"

@implementation FiveTimeDo
@synthesize delegate;

- (void)setMyDelegate:(id <FiveTimeDoDelegate>)d
{
    delegate = d;
}

-(void)doMethod
{
    i = i + 1;
    if( (int) i % 5 == 0 ){
        [self.delegate callThisMethod];
    }
}

@end

ViewController.h

#import <UIKit/UIKit.h>
#import "FiveTimeDo.h"

@interface ViewController : UIViewController <FiveTimeDoDelegate>

@property (retain, nonatomic) NSString *s;

@end

ViewController.m

#import "ViewController.h"

@implementation ViewController
@synthesize s;

... 省略

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    s = @"呼ばれた";
    FiveTimeDo *f = [[FiveTimeDo alloc] init];
    [f setMyDelegate:self];
    [f doMethod];
    [f doMethod];
    [f doMethod];
    [f doMethod];
    [f doMethod];
    [f doMethod];
    [f doMethod];
    [f doMethod];
    [f doMethod];
    [f doMethod];
    [f doMethod];
}

#pragma mark - delegate
- (void) callThisMethod
{
    NSLog(@"%@", s);
}

結果

2012-03-15 18:33:32.628 RENSYU[3524:f803] 呼ばれた
2012-03-15 18:33:32.674 RENSYU[3524:f803] 呼ばれた