__weak是为了解决block的循环引用问题.
例如:
TRBlockObject *blockObj = [TRBlockObject new];
blockObj.block = ^void(void){
NSLog(@"blockObj%@“,blockObj);
};
例中,block属性是blockObj对象的;而在block体中,block又引用了blockObj对象,造成了循环引用。解决的办法是加__weak.
TRBlockObject *blockObj = [TRBlockObject new];
//解决循环引用的方案使用__weak修饰符。
__weak TRBlockObject *weakBlockObj = blockObj;
blockObj.block = ^void(void){
NSLog(@"blockObj%@",weakBlockObj);
};
__weak是弱引用,blockObj被释放的时候,weakBlockObj已经是nil了
2.__block可以访问局部变量,但是不能修改,如果修改局部变量,需要加__block.
例如
__block int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
multiplier ++;//这样就可以了
return num * multiplier;
};
3.如果局部变量是数组或者指针的时候只复制这个指针,两个指针指向同一个地址,block只修改指针上的内容。
例如
NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil];
NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1];
[mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){
[mArrayCount addObject:[NSNumber numberWithInt:[obj length]]];
}];
NSLog(@"%@",mArrayCount);
局部变量mArrayCount是一个指针,指向一个可变长度的数组。在Block里面,并没有修过这个指针,而是修改了这个指针指向的数组。
这就是闭包现象:声明block的时候实际上是吧当时的临时变量又复制了一份,在block里即使修改了这些复制的变量,也不影响外面的原始变量。
但是但是,当变量是一个指针的时候,block里只是复制了一份这个指针,两个指针指向同一个地址。所以,在block里面对指针指向内容做修改,在block外面也一样生效。
转载于:https://blog.51cto.com/11745402/1790943