iOS之Block

使用Block是一个装逼神器,用不好就很容易出现循环引用等问题。

一、Block我们使用的时copy属性,那为什么要用copy而不用其他的属性来修饰呢,其实原理比较简单:

@property(nonatomic, readwrite, copy) completionBlock completionBlock;

(1)正常我们使用Block是在栈上生成的,离开了栈作用域便释放了

(2)如果 copy一个Block ,那么会将这个 Block copy到堆上分配,这样就不再受栈的限制,可以随意使用。

二、Block的循环引用问题

由于我们很多行为会导致 Blockcopy ,而当Block copy时,会对block 中用到的对象产生强引用 (ARC) 或者引用计数加一 (non-ARC)

什么是循环引用?

即 对象有一个Block属性,然而这个Block属性中又引用了对象的其他成员变量,那么就会对这个变量本身产生强应用,那么变量本身和他自己的 Block属性就形成了循环引用。

那怎么解决Block的循环引用问题?

ARC下
1
.__unsafe_unretained typeof(self) weakSelf = self; 2.__weak typeof(self) weakSelf = self; // 主要使用这个来解决 MRC下 __block typeof(self) weakSelf = self;
self.completionBlock = ^ { if (weakSelf.success) { weakSelf.success(weakSelf.responseData); } };
原文地址:https://www.cnblogs.com/ljmaque/p/Block.html