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

代码块的使用小结

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

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

block代码块介绍的更多相关文章

  1. block(代码块)的介绍以及使用方法和变量之间的关系

    http://blog.csdn.net/menxu_work/article/details/8762848 block(代码块)的介绍以及使用方法和变量之间的关系 block(代码块)的介绍以及使 ...

  2. Block代码块中使用局部变量注意点

    第一次写代码遇到报这个错,实在是想不通为什么,按常理应该是不会有问题,报错的呀??纠结了一会之后只好仔细查看报错原因咯,原来是: 当我们在block代码块中使用局部变量时,就会很容易出现如图的错误. ...

  3. IOS学习4——block代码块

    本文转载自:iOS开发-由浅至深学习block 一.关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想 ...

  4. iOS-#ifdef DEBUG代码块介绍

    iOS-#ifdef DEBUG宏定义介绍 一.#ifdef DEBUG代码块 #ifdef DEBUG // Debug 模式的代码... #else // Release 模式的代码... #en ...

  5. IOS Block代码块的定义与使用

    代码块的本质是和其他的变量类似,不同的是,代码块存储的数据是一个函数体.使用代码块,你可以像调用其他标准函数一样的调用,可以传入参数,并得到返回值.     脱字符是代码块的语法标记.下图表示代码块的 ...

  6. OC Block(代码块)

    #import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...

  7. iOS - OC Block 代码块

    前言 Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个 ...

  8. iOS - Block 代码块

    1.Block Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的, ...

  9. [转] java代码块 介绍

    //执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 1 //普通代码块 ...

随机推荐

  1. uboot启动linux的过程

    一.概述 linux内核镜像常见到的有两种形式,zImage和uImage.这两种文件的格式稍有差别,所以启动这两种格式的内核镜像也会有所不同.目前,uboot只支持启动uImage类型的镜像,对zI ...

  2. theano中对图像进行convolution 运算

    (1) 定义计算过程中需要的symbolic expression """ 定义相关的symbolic experssion """ # c ...

  3. March of the Penguins

    poj3498:http://poj.org/problem?id=3498 题意:某个冰块上有a只企鹅,总共可以跳出去b只,问是否可能所有的企鹅都跳到某一块冰块上,输出所有的可能的冰块的编号. 由于 ...

  4. C语言嵌入式系统编程修炼之二:软件架构篇

    模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求.C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行 ...

  5. 深入剖析Java中的装箱和拆箱(转)

    自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 以下是本文的 ...

  6. 14.6.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB 主线程IO 速率:

    14.6.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB 主线程IO 速率: 主线程 在InnoDB 是一个线程 执行各种任务在后台. ...

  7. Android笔记:触摸事件的分析与总结----TouchEvent处理机制

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320   ...

  8. 【HDOJ】2389 Rain on your Parade

    读题显然是二分图匹配,看成guest与umbrella的匹配.匈牙利果断TLE了,其实时间卡的相当紧.HK过的,750ms. /* 2389 */ #include <iostream> ...

  9. Linux Shell编程(19)——测试与分支

    case和select结构在技术上说不是循环,因为它们并不对可执行的代码块进行迭代.但是和循环相似的是,它们也依靠在代码块的顶部或底部的条件判断来决定程序的分支.在代码块中控制程序分支case (in ...

  10. 启动tomcat的 startup.bat屏幕一闪而过

    有时启动tomcat 时,屏幕一闪而过,看不到是那里有问题.要想让屏幕停下来,做法如下: 1.打开 startup.bat 文件,在文件最后加上最后加一行@pause 2.重新运行 startup.b ...