block 入门

来源:互联网 发布:注册淘宝 编辑:程序博客网 时间:2024/06/07 19:34
本文简介

本章不会对Block做过多的实现研究。只是讲解基本的用法。纯粹基础知识。结合实际项目怎么去做举例。Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。

Block简介

Block是一种比较特殊的数据类型。它可以保存一段代码,在合适的时候调用。Block可以访问局部变量,但是不能修改,如果修改局部变量,需要加__block或者__weak修饰局部变量。然而在访问过程中不管你是通过引用来访问一个实例变量还是值来访问一个实例变量它都会产生强引用,从而引起循环引用(解决方法如下)。

Block的修饰

ARC情况下
1.如果用copy修饰Block,该Block就会存储在堆空间。则会对Block的内部对象进行强引用,导致循环引用。内存无法释放。
解决方法:
新建一个指针(__weak typeof(Target) weakTarget = Target )指向Block代码块里的对象,然后用weakTarget进行操作。就可以解决循环引用问题。

2.如果用weak修饰Block,该Block就会存放在栈空间。不会出现循环引用问题。

MRC情况下
用copy修饰后,如果要在Block内部使用对象,则需要进行(__block typeof(Target) blockTarget = Target )处理。在Block里面用blockTarget进行操作。


MRC下__block修饰的对象变量在block里不会被retain,但ARC下会


Block的定义格式

返回值类型(^block变量名)(形参列表) = ^(形参列表) {
};
调用Block保存的代码
block变量名(实参);

作为函数参数定义

(void (^)(形参列表)) 函数参数名;

-(void)sum:(void (^)(int ,int ))sum{

    sum(1,2);

}

作为成员变量定义

@property(nonatomic,copy)void (^成员变量名)(形参列表);


不过在实际开发当中我们大多数都是配合typedef使用的,


1 0