block代码块介绍

关于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(@"
------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);
    };


代码块的使用小结

  1. 在实际开发中,我们在编写一些公共类的时候,代码块其实是可以和协议交互只用的。个人认为,有一些简单地方法,就是可以由代码块来完成的。方便开发。
如果遇到逻辑结构比较简单地,然后代码量比较小的一些方法,可以用代码块编写。但是如果遇到了需要有一定量的代码量的,和一定量的业务处理逻辑的代码,我们需要用协议来实现,这样子可以使代码的逻辑更加清晰。

文章连接:
http://blog.csdn.net/lotheve/article/details/44515561

原文地址:https://www.cnblogs.com/AbeDay/p/5026954.html