__block和__weak

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了__block和__weak相关的知识,希望对你有一定的参考价值。


  1. __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的主要内容,如果未能解决你的问题,请参考以下文章

__block 和__weak

__block和__weak

__block和__weak

__block和__weak的区别

iOS开发-多层嵌套block中如何使用__weak和__strong

__block 和 __weak的区别