__block 和 __weak的区别

news/2024/7/20 15:20:31 标签: 内存管理, 移动开发

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

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


http://www.niftyadmin.cn/n/1045668.html

相关文章

天龙mysql_天龙八部游戏数据库mysql安装.doc

天龙八部游戏数据库mysql安装时间:2011-01-15来源:www.tlbbjd.com 作者:天龙八部私服基地标签:点击: 1804次打开Winscp用二进制方式把mysql数据库安装文件mysql-5.0.45.tar.gz传至linux服务器/home目录下 打开SecureCRT连接linux服务器终端开始执行安装命令: 1,cd /home 进入ho…

ubuntu apache2 php 中文乱码,Apache 2.4 编码GB2312中文乱码的问题

部署了一个项目,代码和数据库都是gb2312的,本地和服务器都是Apache2.4的版本,本地编码没问题,response的content-type是空的。按html的mete解析的,查看源码也是正常的。可是部署到服务器上就出现乱码,虽然手…

Hyper-V 激活Windows系统重启后黑屏的解决方法 + 激活方法

异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 服务器相关的知识点:http://www.cnblogs.com/dunitian/p/4822808.html#iis 直接看激活:http://www.cnblogs.com/dunitian/p/5845589.html#jh 载入安装光盘ISO ShiftF10&#xff0…

php 反序列化 ctf,CTF-Web-PHP反序列化

概念解释PHP 反序列化漏洞又叫做 PHP 对象注入漏洞,我觉得这个表达很不直白,也不能说明根本的问题,不如我们叫他 PHP 对象的属性篡改漏洞好了(别说这是我说的~~)反序列化漏洞的成因在于代码中的 unserialize() 接收的参数可控,从上…

sprongboot mysql登录注册_SpringBoot 完成登录注册简单功能实例

使用工具:intellij idea 15系统环境:windows10JDK:JAVA8SpringBoot:1.3.2进入idea选择new project 进入以下画面Paste_Image.png下一步Paste_Image.pngNAME 是MAVEN里面定义的项目 nameGroup Artifact Version 也是Maven里面的属性Package是你…

16.9.6上午

通用标签属性 内容容器标签 <ol><li> 有序列表 <ul><li> &#xff08;常用&#xff09;无序列表 常用标签 <a >超链接 条件 超链接内容 指向明确 在href里面写上指向地方 功能 1.做超链接 href:"http://***" 2。做下载 不能下载项 TXT…

小程序表单与PHP,小程序授权手机号跟button表单组件—小程序入门与实战【十六】...

上一章节我们学习了小程序登录的部分流程&#xff0c;今天我们继续来把登录流程完善。小程序客户端将获取到的微信用户绑定的手机号传给后端&#xff0c;返回给小程序客户端自定义登录状态token。获取手机号获取微信用户绑定的手机号&#xff0c;需先调用wx.login接口。「请注意…

python调用oracle存储过程传入多参数_Jython zxJDBC/Python cx\u oracle调用oracle的存储过程时参数的数目或类型错误...

尝试制作一个django测试应用程序&#xff0c;它将使用存储的oracle过程来插入/获取数据。在在zxJDBC中使用jython&#xff0c;但同样的错误也适用于python和cx_oracle。在以下是一些暗号&#xff1a;在模型.py在from django.db import modelsfrom django.db import connectionc…