MRC迁移ARC之__block
今日帮着同事把老项目从MRC迁移至ARC,大部分工作无非是删除release,[super dealloc]等方法,只要关闭了MRC编译选项后,编译器能自动帮你检查,block就有一些不一样了,发现许多做iOS开发的同学,对于指针的原理及操作并不明确。下面的如果有错误,也欢迎指正。
__blcok
__block关键字在MRC和ARC下并不一样
MRC:用__block修饰的对象在block中不被retain,就像ARC中的__weak类似。
ARC:用__block修饰的变量在被block捕获时,获取的是该变量的指针,这才能保证该变量可以被block所更改。
在ARC下举个例子
__block long a = 5;
void (^blockObject)(void) = ^{ a = 6;};
blockObject();
这里我们改变基本类型变量a的值,如果不是用__block的话,也是可以做到的.熟悉c语言的同学都应该知道,传递指针
long b = 5;
long *bPointer = &b;
void (^blockObjectNo__block)(void) = ^{ *bPointer = 6;};
blockObjectNo__block();
其实OC中__block的也基本上就是这么实现的,只不过为了方便开发者入门,将这个过程转化为关键字,形势上看起来就像是直接赋值给了变量,本质仍然是传递的是指针。
指针的指针
如果在block中你需要给指针赋值,那么仍然需要__block。可能你会困惑,不是只有基本类型才需要__blcok么,在这里不是本来就是指针么?
正确示例
__block NSObject *originO = [[NSObject alloc] init];
void (^blockO)(void) = ^{ originO = [[NSObject alloc] init];};
blockO();
错误示例
NSObject *originO = [[NSObject alloc] init];
void (^blockO)(void) = ^{ originO = [[NSObject alloc] init];};
blockO();
思路和上面的基本类型一致.block中捕获的仍然是个拷贝指针。可以见下图,图中捕获的originO1这个指针是原来的拷贝,指向同一个堆上的对象。
当进行赋值之后,见下图,更改的不是原来的指针,而是拷贝的指针,指向了block内alloc出来的对象。这就是为什么要写__block的原因。
当然你可以像上面一样,建立指针的指针。
NSObject *originO1 = [[NSObject alloc] init];
NSObject *__strong *pOriginO = &originO1;
void (^blockO_No__block)(void) = ^{ *pOriginO = [[NSObject alloc] init];};
blockO_No__block();
这样也是可以做到的,有的同学可能会比较蒙。其实就是创建了一个指针,这个指针指向一个NSObject *类型的指针。这样拷贝的是指针的指针,就可以获取到原来的指针,就可以修改了。
MRC迁移ARC之__block的更多相关文章
- iOS-旧项目中手动内存管理(MRC)转ARC
在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题, ...
- MRC转ARC(2)
春节前抽空花了一天的时间将手头的工程从MRC转成了ARC,然后陆陆续续地修复一部分因为转ARC引起的内存泄漏和崩溃,到目前为止工程也算是比较稳定了,抽空记上一笔.(虽说这种事情这辈子估计都只会做这么一 ...
- Objective-c的内存管理MRC与ARC
Objective-c的内存管理MRC与ARC Objective-c中提供了两种内存管理机制MRC(MannulReference Counting)和ARC(Automatic Referen ...
- 内存管理-MRC与ARC详解
Objective-C提供了两种内存管理机制MRC(Mannul Reference Counting)和ARC(Automatic Reference Counting),为Objective-C提 ...
- MRC转ARC
转载请注明出处:http://blog.csdn.net/cywn_d/article/details/18222671 1.删除所有retain,release和autorelease. 2.把原来 ...
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...
- MRC BlOCK ARC
/*-------------------MRC环境中-------------------------*/ //使用局部变量:a到block块中,为了在block中能够使用这个变量,将 ...
- @autoreleasepool在MRC和ARC中的区别
对于@autoreleasepool {} (1)在ARC中会销毁所有在里面创建的对象,即使你用外面的Strong指针指向他 (2)在MRC中如果有外部的强指针指向,不会销毁对象,retainCoun ...
- MRC和ARC混编
iOS5.0以后就开始可以使用ARC( Automatic Reference Counting:自动引用计数)来代替之前的MRC(Manual Reference Counting:人工引用计数). ...
随机推荐
- AC日记——最小的N个和 codevs 1245
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 有两个长度为 N ...
- [No000093]按住Alt 再按数字键敲出任意汉字和字符!
1.在notepad里,(中文系统下) 按住Alt 然后按52946最后放开Alt 按住Alt 然后按45230最后放开Alt 按住Alt 然后按50403最后放开Alt 你会看到"我爱你& ...
- PHP的GD库
GD库 PHP通过GD库,可以对JPG.PNG.GIF.SWF等图片进行处理.GD库常用在图片加水印,验证码生成等方面. 绘制线条 要对图形进行操作,首先要新建一个画布,通过imagecreatetr ...
- NHibernate之映射文件配置说明
NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...
- 洛谷P2256 一中校运会之百米跑
题目背景 在一大堆秀恩爱的**之中,来不及秀恩爱的苏大学神踏着坚定(?)的步伐走向了100米跑的起点.这时苏大学神发现,百米赛跑的参赛同学实在是太多了,连体育老师也忙不过来.这时体育老师发现了身为体育 ...
- word-break|overflow-wrap|word-wrap——CSS英文断句浅析
---恢复内容开始--- word-break|overflow-wrap|word-wrap--CSS英文断句浅析 一 问题引入 今天在再次学习 overflow 属性的时候,查看效果时,看到如下结 ...
- shiro-简介
简介: Apache Shiro 是Java的一个安全(权限)框架. Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境. Shiro可以完成:认证 ...
- mac 修改command+q 退出
实在受不了! 在chrome中command+w 是关闭当前页面,command+q 退出浏览器: 经常查阅资料打开了N多个窗口,关闭时不小心将command+q当command+w按: so ... ...
- vue.js学习(第一课)
学习资料 来自台湾小凡! vue.js是javascript的一个库,只专注于UI层面,核心价值永远是 API的简洁. 第一课: 不支持IE8. 1.声明式渲染: el元素的简称 element : ...
- 【BZOJ 3754】Tree之最小方差树
http://www.lydsy.com/JudgeOnline/problem.php?id=3754 核心思想:暴力枚举所有可能的平均数,对每个平均数排序后Kruskal. 正确的答案一定是最小的 ...