block语法:
返回值类型 (^block名称)(参数名1 参数,参数名2 参数, ...) = ^(参数名1 参数,参数名2 参数, ...) {
需要进行的操作,比如返回值什么的.
};
调用
block名称(参数名1 参数,参数名2 参数, ...);
我看这些语法的时候,很头疼,还是直接上代码吧.
根据返回值和参数,可以分为
- 有参数,有返回值的
int (^myBlock2)(int a , int b) = ^(int a , int b){
return a + b;
};
int sum = myBlock2(3 , 4);
- 有参数没有返回值
void (^myBlock4)(int a) = ^(int a){
NSLog(@"is block");
};
myBlock4(3);
- 没有参数没有返回值
void (^ myBlock)() = ^(){
NSLog(@"is block");
};
myBlock();
- 没有参数有返回值
int (^myBlock5)() = ^(){
int a = 5;
return a;
};
myBlock5();
基本就分为这几种.还有一种写法是,用typedef声明block的.
// 有参数,有返回值
typedef int (^SumBlock)(int a , int b);
调用的时候
SumBlock myBlock3 = ^(int a , int b) {
return a + b;
};
NSLog(@"%d" , myBlock3(2 , 1));
这些都是最简单的block用法.
下面说一个block的简单用法.block传值
首先有两个类,Person,Dog
- 1.在Dog的.h方法里面声明block
// 定义一个block变量
@property (nonatomic , copy) void(^BarkCallBack)(Dog *dog , int count);
- 2.初始化Dog的时候,让Dog每隔1s叫一下
-(instancetype)init
{
self = [super init];
if (self) {
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(upDateTimer:) userInfo:nil repeats:YES];
}
return self;
}
- 3.然后在叫的事件里面给Person传递叫的次数
-(void)upDateTimer:(id)arg {
self.barkCount++;
// 给Person汇报一下,调用Block
self.BarkCallBack(self , self.barkCount);
}
- 4.在Person类中声明Dog类
@property (nonatomic , strong) Dog *dog;
- 5.实现Dog的set方法
-(void)setDog:(Dog *)dog {
_dog = dog;
[dog setBarkCallBack:^(Dog *dog, int count) {
NSLog(@"dog交了%d声" , count);
}];
}
- 在控制器里面实现
Person *p = [[Person alloc] init];
Dog *dog = [[Dog alloc] init];
[p setDog:dog];