码迷,mamicode.com
首页 > 其他好文 > 详细

__block和__weak

时间:2016-06-20 16:04:10      阅读:329      评论:0      收藏:0      [点我收藏+]

标签:ios block


  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

标签:ios block

原文地址:http://11745402.blog.51cto.com/11735402/1790943

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!