iOS block介绍和使用技巧(基础篇)

来源:互联网 发布:算法分析与设计吕国英 编辑:程序博客网 时间:2024/05/16 11:16

第一部分 block入门
声明和使用一个block

int multiplier = 7;int (^myBlock)(int)=^(int num){  return num*multiplier;};printf("%d",myBlock(3));//prints "21"//block可以使用相同作用域里定义的变量

声明一个block的引用

void (^blockOne)(void);//无参无返回值int (^blockTwo)(int,char);//int和char参数,int返回值void(^blocks[10])(int);//有10个block组成的array
typedef float (^MyBlockType)(float,float);MyBlockType myfirstBlock=//...;MyBlockType mySecondBlock=//...;

创建一个Block
^修饰符来表示一个block的开始,他通常后面跟着一个()包起来的参数列表。block的主体一般包含在{}里面。下面定义了一个简单的block

int (^oneFrom)(int);oneFrom=^(int anInt){return anInt-1;};

全局block

#import<stdio.h>int GlobalInt = 0;int (^getGlobalInt)(void)=^{return GlobalInt};

block变量

block int x = 123;//x lives in block storagevoid (^printXAndY)(int)=^(int y){x=x+y;printf("%d %d\n",x,y);};printXAndY(456);//579 456

对象(object)和block变量
当block里引用一个对象时,该对象会被retain,但是__block存储类型修饰符标记不会被retain

调用一个block

int (^oneFrom)(int);oneFrom=^(int anInt){return anInt-1;};oneFrom(10);//9float(^distance)(float,float,float)=^(float s.float a,float t){float d=(s*t)+.5*a*t*t;return d;};float howfar=distance(0.0,9.8,1.0);//4.9

block作为一个函数参数
block作为一个方法的参数

block BOOL found=NO;NSSet *aset=@[@"Alpha",@"bata",@"Gamma"];NSString *str=@"gamma";[aset enumerateObjectsUsingBlock:^(id obj,BOOL *stop){if([obj localizedCaseInsensitiveCompare:str]==NSOrderSame)*stop=YES;found=YES;}}];

拷贝block
你可以用c函数来拷贝和release一个block

block copy();block release();

注意:尽量不要在循环中使用block

0 0
原创粉丝点击