1.Block中相互引用问题解决方案:
__weakThirdViewController*weakSelf
=self;
__weaktypeof(self)
weakSelf =
self;
2.为什么Block使用copy而不用strong
@property(nonatomic,copy)void(^block)();
或者set方法中_block= [blockcopy];
因为block变量默认是声明为栈变量(创建时在栈区分配的内存),为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy。
使用完[blockcopy]后打印结果如下:
<__NSStackBlock__: 0x7fff5fbff728> ,
<__NSMallocBlock__: 0x100115b10>
3.block外的局部遍历可以直接使用 但是其实是block自己复制了一个常量在使用 此时这个常量不能修改值 会报错
NSIntegertheNum =10;
void (^myBlock)() = ^{
//如果在block中使用block之外的局部变量,block会将局部变量的值进行保留
NSLog(@"%ld",theNum);
};
4.在block中想修改外部变量的值 直接修改会报错 要使用__block修饰
__blockintt
=20;//告诉编译器Block会修改这个值
void(^Change)(void)
= ^(void){
t =50;
};
5.MRR情况下使用Block的内存管理:
使用以下函数 retain realease
Block_copy(self.block);
Block_release(self.block);
6.block导致的相互引用中就算是(使用self的_index属性)或者(调用self的方法)也会导致循环引用 如果强行用 可以使用强指针再指向这个弱指针