博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
__block 和 __weak的区别
阅读量:4465 次
发布时间:2019-06-08

本文共 1548 字,大约阅读时间需要 5 分钟。

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主要适用于避免循环引用    , 如何避免请见博文:

转载于:https://www.cnblogs.com/MasterPeng/p/5841774.html

你可能感兴趣的文章
机器学习的12条核心知识
查看>>
linux命令
查看>>
《结对-HTML贪吃蛇游戏项目-测试过程》
查看>>
阿里云ECS服务器云监控(cloudmonitor)Go语言版本插件安装卸载与维护
查看>>
Data Governance
查看>>
JBOSS的安全配置
查看>>
jboss eap6.1(1)
查看>>
docker微服务部署之:四、安装docker、docker中安装mysql和jdk1.8、手动构建镜像、部署项目...
查看>>
RocketMQ学习笔记(15)----RocketMQ的消息模式
查看>>
MyEclipse 启动 tomcate 失败 解决方法
查看>>
HowTo/Initramfs
查看>>
sqlserver 限制用户只能访问指定的视图
查看>>
操作系统理论
查看>>
UVA11077 Find the Permutations —— 置换、第一类斯特林数
查看>>
tcp、udp、ip、icmp报文格式分析
查看>>
java内存管理
查看>>
Unit02: jQuery事件处理 、 jQuery动画
查看>>
Thymeleaf显示Map集合数据
查看>>
asp.net中利用JSON进行增删改查中运用到的方法
查看>>
nodejs save遇到的一个坑
查看>>