block的定义:
int (^BFunc) (int a);
c的回调函数为 :
int (*CFunc) (int a);
使用为 int ret = BFunc(100);
int ret = CFunc(100);
Blocks typedef 定义
typedef int (^SumBlockT)(int a, int b);
__block关键字, 用于修饰变量。变成一个全局的数。
blocks的使用举例:
void (^myblocks) (void) = NULL;//定义一个blocks,变量名为myblocks,初始化为NULL
myblocks = ^{
NSLog(@"in blocks");
};
NSLog(@"before myblocks");
myblocks();
NSLog(@"after myblocks");
执行的结果为:
before myblocks
in blocks
after myblocks
举例2:
int (^myblocks2)(int a, int b) = ^(int a, int b){
int c = a +b;
return c;
};
NSLog(@"before blocks2");
int ret = myblocks2(10, 20);
NSLog(@"after blocks ret %d", ret);
打印的结果为:
before blocks2
after blocks ret 30
举例3:
__block int sum = 0;
int (^myblock3)(int a, int b) = ^(int a, int b){
sum = a + b;
return 3;
};
myblock3(10, 20);
NSLog(@"sum is %d", sum);
打印结果为:
sum is 30
举例4:
typedef int (^SumBlockT) (int a, int b);//定义个typedef的blocks使用 SumBlockT myblocks4 = ^(int a, int b){ NSLog(@"c is %@", a + b); return 0; } myblocks4(20, 50);
打印结果为:
c is 70
在使用定时器时,为了让定时器转起来,使用
while(1){
[[NSRunLoop currentRunLoop] run];
}
在类之间的blocks的使用:
(1)A类去调用其他类的时候,需要创建一个blocks的变量
(2)并声明一个设置的方法,向外暴露,参数为一个blocks
(3)在.m中,实现此方法。将blcoks copy一份。 并在copy前做一次release
(4)在B类中,调用A类的暴露方法, 将blocks的实现传递。
(5)在A类中,就可以使用blocks变量进行操作了。(操作的具体实现就是其他类中的实现)
这就实现在A类中调用B类的方法。