两个对象在通信时,利用block,其中一个类声明一个block,另一个类包含前一个类的对象,通过设置block函数,把回调函数的实现传递给第一个类
dog.h
#import <Foundation/Foundation.h>
@interface dog : NSObject
{
@public
int _ID;
NSTimer *timer;
int barkCount;
void (^BarkCallBack)(dog *thisDog,int count);
}
@property(assign,nonatomic) int ID;
-(void)setBark:(void (^)(dog *thisDog,int count))eachBark;
@end
dog.m:
#import "dog.h"
@implementation dog
-(id)init
{
self=[super init];
if(self)
{
NSLog(@"dog init start");
barkCount=0;
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(bark:) userInfo:nil repeats:YES];
//timer=[NSTimer timerWithTimeInterval:1 target:self selector:@selector(bark:) userInfo:nil repeats:YES];
}
return self;
}
-(void)bark:(NSTimer *)timer
{
barkCount++;
NSLog(@"dog %d bark count %d",self.ID,barkCount);
if (BarkCallBack) {
BarkCallBack(self,barkCount);
}
}
-(void)setBark:(void (^)(dog *thisDog,int count))eachBark
{
[eachBark release];
BarkCallBack=[eachBark copy];
}
-(void)dealloc
{
[super dealloc];
}
person.h
#import <Foundation/Foundation.h>
#import "dog.h"
@interface person : NSObject
@property(nonatomic,retain)dog *dobObj;
@end
person.m:
#import "person.h"
@implementation person
-(void)setDobObj:(dog *)dobObj
{
if(_dobObj!=dobObj)
{
[_dobObj release];
_dobObj=[dobObj retain];
[_dobObj setBark:^(dog *thisDog, int count) {
NSLog(@"person dog %d count %d",thisDog.ID,count);
}];
}
}
@end
main函数:
#import <Foundation/Foundation.h>
#import "person.h"
#import "dog.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
person *andy=[[person alloc] init];
dog *heibei=[[dog alloc] init];
heibei.ID=10;
andy.dobObj=heibei;
while (1) {
[[NSRunLoop currentRunLoop] run];
}
[heibei release];
NSLog(@"Hello, World!");
}
return 0;
}