一、__weak、__block区别!
- __block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
- __weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
- __block对象可以在block中被重新赋值,__weak不可以。
使用一:解决循环引用
- 具体参考文章 -- 循环引用的场景 & 处理
__weak:ARC下
__block:MRC下
__unsafe_unretained:如果要兼容iOS4.3,则用__unsafe_unretained代替__weak,不过目前基本不需考虑这么low的版本
使用二:修改变量
- 具体参考文章 -- Block - 局部变量和全局变量在Block中的使用
__block修饰的变量在块中保存的是变量的地址。
- 修改局部变量
__block int number=100;
void (^TestBlock)(int)=^(int x){
number=number+x;
NSLog(@"TMD 加了一个 __block 修饰下就好了:%d",number);
};
// 调用
TestBlock(100);
- 全局变量与Block
int value=100;
-(void)testMethod{
void (^TestBlock)(int)=^(int x){
value=value+100;
NSLog(@"看看是不是喽%d",value+x);
};
TestBlock(100);
}