OC中的blocks和C++中的函数指针类似,从外观和使用上可以看出
Int(*CFunc)(int a); //C语言的函数指针。 调用 Intret=(CFunc)(10);
Int(^BFunc)(int a); //Blocks 调用 intret=(BFunc)(10);
也可以使用typedef关键字来定义blockstypedef (void)(^BFunc)(int a,int b);
BFunc func=^(int a,int b){
return a+b;
};
func(10,20);即可调用block块。
__blocks关键字
如下代码:
typedef (void)(^BFunc)(int a,int b);
__blocks int sum;
BFunc func=^(int a,int b){
sum=a+b;
return sum;
};
如果没有__blocks关键字修饰 sum,那么在blocks块中,sum就会提示错误,没有定义
苹果官方建议尽量多用blocks应用。在多线程,异步任务,动画转场用的很多,用在回调时候,可以使用这种机制。
考虑如下情景:
一个Person类,一个Dog类,每个Person有一个Dog,当dog发先情况时候,会通知主人,也就是调用主人的方法。通过协议可以实现,这里使用blocks回调机制来实现:
Person类
#import <Cocoa/Cocoa.h>
#import "Dog.h"
@interface Person : NSObject {
Dog *_dog;
}
@property (retain)Dog *dog;
@end
#import "Person.h"
@implementation Person
@synthesize dog=_dog;
-(void)setDog:(Dog*)thisDog
{
if(_dog!=thisDog)
{
[_dog release];
_dog =[thisDog retain];
[_dog setBarkCallback:^(Dog* thisDog,int count){
NSLog(@"dog bark infom person ,id %d,count %d",[thisDog ID],count);
}];
}
}
-(Dog*)dog{
return _dog;
}
-(void)dealloc{
_dog=nil;
[super dealloc];
}
@end
Dog类
#import <Cocoa/Cocoa.h>
@interface Dog : NSObject {
int _ID;
NSTimer *timer;
int barkCount;
//定义一个blocks变量
void (^barkCallback) (Dog *thisDog,int count);
}
@property (assign) int ID;
-(void)setBarkCallback:(void (^)(Dog *thisDog,int count))eachbark;
@end
#import "Dog.h"
@implementation Dog
@synthesize ID=_ID;
-(void)updateTimer:(id)arg
{
NSLog(@"dog %d bark count %d",_ID,++barkCount);
//使用blcok来给 Person汇报一下
if(barkCallback)
barkCallback(self,barkCount);
}
-(void)setBarkCallback:(void (^)(Dog *thisDog,int barkcount))eachbark{
[barkCallback release];
barkCallback=[eachbark copy];
}
-(id) init
{
if(self=[super init])
{
timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];
}
return self;
}
-(void)dealloc
{
[barkCallback release];
[super dealloc];
}
@end
主函数
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// insert code here...
NSLog(@"Hello, World!");
Person *xiaoli=[[Person alloc]init];
Dog *dog1=[[Dog alloc]init];
[dog1 setID:10];
[xiaoli setDog:dog1];
[dog1 release];
while (1) {
[[NSRunLoop currentRunLoop]run];
}
[pool drain];
return 0;
}
运行结果如下:
初学。。多多指教。