星空网 > 软件开发 > 操作系统

__block 和 __weak的区别

Blocks理解:

Blocks可以访问局部变量,但是不能修改

如果修改局部变量,需要加__block

 

 __block int multiplier = 7;   int (^myBlock)(int) = ^(int num) {     multiplier ++;//这样就可以了     return num * multiplier;   };

 

 

2、如果局部变量是数组或者指针的时候只复制这个指针,两个指针指向同一个地址,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这个局部变量啊。mArrayCount是一个指针,指向一个可变长度的数组。在block里面,并没有修改这个指针,而是修改了这个指针指向的数组。换句话说,mArrayCount是一个整数,保存的是一块内存区域的地址,在block里,并没有改变这个地址,而是读取出这个地址,然后去操作这块地址空间的内容。

这是允许的,因为声明block的时候实际上是把当时的临时变量又复制了一份,在block里即使修改了这些复制的变量,也不影响外面的原始变量。即所谓的闭包。

但是当变量是一个指针的时候,block里只是复制了一份这个指针,两个指针指向同一个地址。所以,在block里面对指针指向内容做的修改,在block外面也一样生效。

 

__weak __typeof(&*self)weakSelf =self; 等同于

__weak UIViewController *weakSelf =self;

为什么不用__block 是因为通过引用来访问self的实例变量 ,self被retain,block也是一个强引用,引起循环引用,用__week是弱引用,当self释放时,weakSelf已经等于nil。

扩展:NSTimer注意避免循环引用的地方,需要找个合适的时机和地方来 invalidate timer

 

在引用计数的环境里面,默认情况下当你在block里面引用一个Objective-C对象的时候,该对象会被retain。当你简单的引用了一个对象的实例变量时,它同样被retain。但是被__block存储类型修饰符标记的对象变量不会被retain

注意:在垃圾回收机制里面,如果你同时使用__weak和__block来标识一个变量,那么该block将不会保证它是一直是有效的。 如果你在实现方法的时候使用了block,对象的内存管理规则更微妙:也是(__weak与__block区别:)

1、如果你通过引用来访问一个实例变量,self会被retain。
2、如果你通过值来访问一个实例变量,那么变量会被retain

 

 

__weak主要适用于避免循环引用    , 如何避免请见博文:http://www.cnblogs.com/MasterPeng/p/5311911.html




原标题:__block 和 __weak的区别

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

RCEP对跨境电商行业的机遇与变革:https://www.ikjzd.com/articles/137015
罚款3500万欧元?盘点亚马逊被罚的那些事:https://www.ikjzd.com/articles/137017
重要通知!亚速双旦福利震撼上线,多重惊喜疯狂来袭!:https://www.ikjzd.com/articles/137018
个人做shopify-一件代发更方便了!:https://www.ikjzd.com/articles/137019
中东电商模式之争,亚马逊中东站开放后市场是否面临洗牌?:https://www.ikjzd.com/articles/13702
倒计时|VOVA元旦活动报名即将截止!:https://www.ikjzd.com/articles/137020
TikTok 将推出先买后付服务 :https://www.goluckyvip.com/news/188219.html
深圳有没有比较好玩的景点 深圳有没有比较好玩的景点推荐一下:https://www.vstour.cn/a/366175.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流