__block和__weak
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了__block和__weak相关的知识,希望对你有一定的参考价值。
__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外面也一样生效。
以上是关于__block和__weak的主要内容,如果未能解决你的问题,请参考以下文章