1.block默认在栈中,调用_Block_copy(只会改变栈block的存储区域)会将block拷贝到堆;赋值给block变量的block存储在全局数据区,如果block引用了外部变量,则存储在堆
2.对block做copy操作会对它所引用的对象做retain操作,
非ARC:如果引用的对象用__block修饰,不会retain
ARC:用__weak/__unsafe__unretained修饰,不会retain
* block是控制器的属性,如果block内部没有使用weakSelf将会造成内存泄露
* 把block内部抽出一个作为self的方法,当使用weakSelf调用这个方法,并且这个方法里有self的属性,block不会造成内存泄露
* 当block不是self的属性时,block内部使用self也不会造成内存泄露
* 当使用类方法有block作为参数使用时,block内部使用self也不会造成内存泄露
* 如果self没有直接或间接强引用block,则block中不需要用weakSelf,例如 Masony、AFNetWorking
网友评论