关于block的简单介绍
什么是block?
Block是C语言的一个语法特性,同时也是C语言的运行时特性,它很像C中的函数指针,因为你可以像使用函数指针一样的去使用block对象;它也很像C++中的函数对象,因为除了要执行的代码,block还可以携带和block绑定的状态信息。
代码块的结构
代码块的简单赋值与调用
// 将block块赋值给一个变量testblock,然后直接通过变量来调用代码块中的代码
int(^testblock)(int a, int b) = ^(int a, int b){
return a + a + b * a;
}; NSLog(@"\n------testblock代码块执行方法为:%d", testblock(3,6));
typedef代码块
定义一个代码块之后,我们就可以使用这个这个名字来设置代码块了。
typedef void(^ABETestBlock)(int a, int b); - (void)startTestSuccessBlock:(<span style="font-family: Arial, Helvetica, sans-serif;">ABETestBlock</span><span style="font-family: Arial, Helvetica, sans-serif;">) sucessBlock</span> withFailedBlock:(<span style="font-family: Arial, Helvetica, sans-serif;">ABETestBlock</span><span style="font-family: Arial, Helvetica, sans-serif;">) failedBlock;</span>
__block的使用
在block内只能读取在同一个作用域的变数而且没有办法修改在block外定义的任何变数,此时若我们想要这些变数能够在block中被修改,就必须在前面挂上__block的修饰词
int number1 = 1;
__block int number2 = 2; void(^block__test)() = ^(){
number1++;//这句话不可以执行,因为没有 __block 前缀
number2++;
};
block__test();//调用代码块
NSLog(@"%d", number1);
NSLog(@"%d", number2);
__weak的使用
在使用块时候,我们如果在代码块中引用自己(self),就会引起引用循环,造成内存泄露。这个时候,我们一般都是使用__weak来解决这种内存泄露问题的。
__weak typeof(self) weakSelf = self;
代码块的简单使用:
创建一个类,然后在这个类中使用代码块,替代协议
#import <UIKit/UIKit.h> typedef void(^blockOne)(int a, int b); @interface ABEButton : UIButton @property (strong, nonatomic) blockOne buttonBlock1;
@property (strong, nonatomic) void(^buttonBlock2)(int a, int b); + (ABEButton*)buttonWithBlock:(void(^)(int a, int b)) block; @end
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
NSLog(@"开始点击");
if (_buttonBlock1) {
_buttonBlock1(100, 200);
}
if (_buttonBlock2) {
_buttonBlock2(100, 200);
} return [super beginTrackingWithTouch:touch withEvent:event]; } + (ABEButton*)buttonWithBlock:(void (^)(int, int))block{
if (block) {
block(100, 200);
}
ABEButton *button = [[ABEButton alloc] init];
return button;
}
下面是ABEButton(刚刚创建的类)的使用:
ABEButton *button = [ABEButton buttonWithBlock:^(int a, int b) {
NSLog(@"button初始化,方法中调用block代码块");
NSLog(@"参数为:%d, %d", a, b);
}];
button.buttonBlock1 = ^(int a, int b){
NSLog(@"点击按钮时调用buttonBlock1代码块");
NSLog(@"参数为:%d, %d", a, b);
};
button.buttonBlock2 = ^(int a, int b){
NSLog(@"点击按钮时调用buttonBlock2代码块");
NSLog(@"参数为:%d, %d", a, b);
};
代码块的使用小结
- 在实际开发中,我们在编写一些公共类的时候,代码块其实是可以和协议交互只用的。个人认为,有一些简单地方法,就是可以由代码块来完成的。方便开发。
如果遇到逻辑结构比较简单地,然后代码量比较小的一些方法,可以用代码块编写。但是如果遇到了需要有一定量的代码量的,和一定量的业务处理逻辑的代码,我们需要用协议来实现,这样子可以使代码的逻辑更加清晰。
文章连接:
http://blog.csdn.net/lotheve/article/details/44515561