为什么要用代码块
为了方便实现并发性, 增强函数的功能, 可以通过代码块绑定变量来创建对象. 把一段代码当一个变量使用.
block详解
代码块的声明和实现
可以像声明一个函数一样来声明一个block ,可以像定义一个函数的方法一样来定义一个block,也可以将block当作一个对象来调用。
代码块的声明:
返回值类型(^代码块名字)(参数列表)
代码块实现:
代码块名字=^(参数列表){代码块的行为主体};
//声明一个代码块
void(^aBlock)(NSString*x);
//实现代码块
aBlock=^(NSString *x){
NSLog(@"%@",x);
};
//代码块的调用
//直接调用(给参数赋值)
aBlock(@"12345");
//double 长X,宽y 求面积
double(^getArea)(double x,double y);
getArea=^(double x,double y){
double area=x*y;
return area;
};
double area=getArea(2,3);
NSLog(@"%.2f",area);
//在block中使用全局变量和局部变量
//使用全局变量,参数列表内不用加参,声明后直接实现block
void(^myBlock)()=^(){
global++;
NSLog(@"%d",global);
};
//调用
myBlock();
//定义一个局部变量,如果需要在代码块中修改一个局部变量的值,需要在局部变量的前面加上__block,如果不加这个修饰,会引起报错
__block double y=3.4;
void(^block)()=^(){
y++;
NSLog(@"%f",y);
};
block();
}
使用代码块完成线程并发管理
并发是同一时间执行多项任务.
苹果引入了GCD技术来协助完成线程管理,要想使用GCD,就需要代码块或函数作为线程来运行. GCD决定需要多少线程并安排他们运行的进度,它是运行在系统级别上的,所以可以平衡应用程序所有内容的加载,以此提高计算机或设备的执行效率.
关键字@synchronized, 有一个参数,可以确保不同的线程会连续的访问临界区的代码.
@synchronized (theOBject)
{}
GCD可以使用调度队列,只需要写下一个代码,把它指派为一个度列,系统就会执行它了. 可以同步或一部执行任意代码,有3种类型的队列, 连续队列,并发队列和主队列.
死锁: 是两个或多个任务在等待他方运行结束. 要避免出现死锁, 绝对不要给运行在同一队列中的任务调用dispatch_sync或dispatch_sync_f函数.
内存管理
调度队列是引用计数对象,可以使用dispatch_retain()和dispatch_release()来修改队列的保留计数器的值,只能对自己创建的队列使用这些函数不能使用在全局调度队列上,
内存管理
ge_transfer关键字)这个关键字把对象的内存管理由全局释放池变换成了我们的函数,当我们的函数结束时,ARC会给它的保留计数器的值减1,被减到0对象就会被释放,如果对象没有被释放,myContext就会一直留在内存中.
_bridge可以把内存管理交给系统来管理,不用手动管理上下文的内存.