zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    windows下用Python把pdf文件转化为图片(png格式)
    SQL优化实战:外层查询条件放到内层查询中(predicate push down)
    SQL优化实战:临时表+分批提交+按日结存
    SQL优化:重新编译存储过程和表
    论坛中的问题:47 数据库的事务是100%的吗?
    代理模式
    建造者模式
    工厂模式
    面向对向设计
    单例设计模式
  • 原文地址:https://www.cnblogs.com/AbeDay/p/5026954.html
Copyright © 2011-2022 走看看