您的位置:首页 > 移动开发 > IOS开发

iOS中block初体验

2016-01-11 19:40 281 查看
小白一枚,被block代理什么的折磨了好久,到现在也没有完全弄明白block是怎么一回事,今天在看李明杰老师视频学习的时候总结了一些基本概念,不对的地方,还请众神指点呀。

block书写格式:

返回值类型(^ block名称)(参数列表)=^{代码块}

下面先一步步 从无返回值无参数 到有返回值有参数的block开始

1. 首先看一个无返回值无参数

例:

1.1
void(^myblock)( ) ;
myblock=^{
NSLog(@"+++++++");
}
myblock( );    //调用部分

1.2(和1.1作用相同)
void(^myblock)( ) ;
myblock=^{
NSLog(@"+++++++");
}
myblock( );    //调用部分


详解:

先理解它的这个结构 以等号左右说明 定义部分=赋值部分

{}内的才为代码块

第4行才是这个block的调用部分 此时2行才真正的执行。

2. 有参数有返回值的block

我始终搞不懂为什么要用到block 尽管百度出各种好处但是没有码代码光理解 确实记一次忘一次熊瞎子掰苞米来着。

下面有这样一个需求,要有一个只执行加法的盒子 相当于计算器,每次我只负责填两个数字加到盒子里 结果则由盒子给我输出来。

下面这样操作,我要设置这个盒子,他的内部功能就是执行加法操作 入口呢则是我向盒子里面填两个数字 出口则是他执行完输出结果。

这里的

第1步 输入过程就是输入参数

第2步 就是代码块

第3部 就是调用代码块部分。

码代码过程 如果开始学习 建议先从第2部分也就是等号右边开始写,这部分是需要重复执行的代码,就是那个运算过程,然后再声明一个block对象,并把等号右边的赋值给这个对象。

好啰嗦 看代码吧

int(^mumblock)(int,int);  //定义 block类型;声明block对象mumblock部分 相当于int a;
mumblock=^(int a, int b){  //赋值部分 相当于int a =3;
return a-b;            //代码块部分
};
NSLog(@"%d",sumblock(10,20));//调用部分
//输出结果 30


block其实和NSString一样 需要定义对象( =号左侧) ,给对象赋值(=号右侧)。

调用部分 可以循环n次 是不是很方便?! 不用每次都写{}里面的内容了?!

详解:

/// 需求是计算a+b
1 写出{  }内的内容,
/// 需求传参数
2 所以在{  }左侧写上^(int a,int b)
/// 需要将现在的block赋值给一个block类型变量 先去声明变量(下面��)
/// 声明block类型变量
3 int(^mumblock)(int,int);
/// 将2种定义的代码块(对象值) 赋值给声明的block类型的变量mumblock;
4 sumblock=^(int a,int b){
return a+b;
};

///   完整的block
int (^sumblock)(int,int)=^(int a,int b){
return a+b;
};
NSLog(@"%d",sumblock(10,20));


3.还有一个typedef的问题 这有问题的话 大概就是因为没有搞懂block 谁是对象 谁是数据类型。typedef的作用 就是重新定义一个数据类型 。

先看代码

int(^sumBlock)(int,int)=^(int a,int b){ //block类型定义
return a+b;
};

int(^subBlock)(int,int)=^(int a, int b){//block类型定义
return a-b;
};

int(^mulBlock)(int,int)=^(int a, int b){//block类型定义
return a*b;
};

//调用
NSLog(@"%d,%d,%d",sumblock(10,20),subblock(10,5),mulBlock(3,3));
输出结果:30,5,9


发现规律没?第1行 定义block类型的时候,重复相同代码,也就是sumBlock、subBlock、subBlock三个block对象 用的是相同的block数据类型来定义的,就好比nsstring定义3个对象一样。

因为block类型重复 需要重复写 然而程序员又是那么聪明(lan)所以就用typedef来重新定义block的数据类型。看代码 。

typedef int(^MyTypedefBlock)(int,int);

MyTypedefBlock sumBlocl=^(int a,int b){
return a+b;
};

MyTypedefBlock subBlocl== ^(int a,int b){
return a-b;
};
MyTypedefBlock mubBlocl== ^(int a,int b){
return a*b;
};

//调用
NSLog(@"%d,%d,%d",sumblock(10,20),subblock(10,5),mulBlock(3,3));
输出结果:30,5,9
// 两种结果相同 所以不要乱 首先明白 那个是block的数据类型是什么,再知道这个类型定义的对象是谁,谁又给这个对象赋值的。typedef只是减少了代码 看起来更清楚了。


End : litter white 刚刚开始iOS开发工作,希望和大家共同学习。

写的内容主要是给和我一样的小白们相互了解学习的,路过大神多指导哈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息