《ARC以及非ARC的讨论》
ARC的机制是什么?它在那里放入retain/release函数调用?
请停止思考这些问题,把更多的精力放在下面的问题上,比如你的程序逻辑,对象的强,弱引用,对象的所属关系,可能的循环引用等问题上。
我还需要为我的类写一个dealloc函数么?
可能。
因为ARC并不自动调用malloc/free,并不自动管理像核心功能对象、文件描述符等的生命周期,所以你仍然需要在dealloc中释放它们。
你不会(实际上是不能)释放对象实例,但是你仍然需要为系统类调用[self setDelegate:nil]或其他ARC不会自动生产释放代码的情况下释放资源。
dealloc方法在ARC不是必须的,并且不许调用[super dealloc]。
ARC中会出现循环引用(retain cycles)么?
是的。
ARC自动产生retain/release函数,同时也继承了产生循环引用的机制。幸运的是,ARC很少有内存泄漏,因为在声明属性的变量的时候决定是否使用retain。
注:请搜索什么是retain cycles.
ARC下面的块代码如何工作?
块代码在ARC方式下,只能在栈上传递的方式下工作,比如在return语句中。你不用在调用Block Copy。你还是必须在为arrayWithObjects: 传入栈的时候使用[^{} copy]和其他的retain功能的函数。
有 一件事情需要提到,在ARC方式下,__block NSString *S是可以使用,它不是一个野指针。使用_block __unsafe_unretained NSString *S 或者 (更好的方式) __block __weak NSString *S.
在支持ARC的工程中我能创建实例数组么?
是的,你可以,如下例所示:
// Note calloc() to get zero-filled memory.__strong SomeClass **dynamicArray = (__strong SomeClass **)calloc(sizeof(SomeClass *), entries);for (int i = 0; i < entries; i++) {dynamicArray[i] = [[SomeClass alloc] init];}// When you're done, set each entry to nil to tell ARC to release the object.for (int i = 0; i < entries; i++) {dynamicArray[i] = nil;}free(dynamicArray);
这里有几点需要注意的地方:
你必须在某些情况下写__strong SomeClass **,因为如果你不写,缺省的是__autoreleasing SomeClass **.
申请的内存必须使用0填充。
在释放这个数组前,你必须设置每一个元素为nil(调用memset,并传入0是没有用的)。
你必须避免使用memcpy或realloc。
ARC慢么?
这 个取决你如何衡量这个问题了,不过一般来说,这个问题的答案是“no”。下面是原文的解释,我总结的是要相信编译器在这个方面的能力。
It depends on what you’re measuring, but generally “no.” The compiler efficiently eliminates many extraneousretain/release calls and much effort has been invested in speeding up the Objective-C runtime in general. In particular, the common “return a retain/autoreleased object” pattern is much faster and does not actually put the object into the autorelease pool, when the caller of the method is ARC code.
One issue to be aware of is that the optimizer is not run in common debug configurations, so expect to see a lot more retain/release traffic at-O0 than at-Os.
在ObjC++模式,ARC能否工作?
式的,你甚至可以在类或者容器中使用strong/weak id。为了能正常工作,ARC在编译期间会在复制构造函数和析构函数中加入retain/release方面的逻辑。一个事情需要避免的就是,你不能为某些指针使用__strong,例如:
std::vector<__strong NSString*> V;
那些类不支持自动nil化的弱引用?
下面的类的实例不能使用自动nil化的弱引用
NSATSTypesetter, NSColorSpace, NSFont, NSFontManager, NSFontPanel, NSImage,NSMenuView,NSParagraphStyle,NSSimpleHorizontalTypesetter,NSTableCellView,NSTextView,NSViewController,NSWindow,
andNSWindowController. 还有,OS X上的AV Foundation框架中所有类都不支持自动nil化的弱引用。
如果属性变量是这些类的实例的时候,使用assign来替代weak;作为变量,使用__unsafe_unretained来替代__weak。
此外,你也不用对NSHashTable,NSMapTable, 和NSPointerArray的实例做弱应用。
在写类似于NSCell这样使用了NSCopyOjbect的子类的时候有什么需要特别关注的地方么?
没有什么特别的,ARC会做一切事情。
我可以为每一个文件单独指定是否使用ARC么?
是的。
当你为一个旧的工程添加ARC是,编译选项-fobjc-arc对所有的文件都是有效的。你可以使用编译选项-fno-objc-arc为某个类单独禁止
ARC。在target上的Build Phases 页,打开Compile
Sources组,这里有一个文件列表,双击某个文件,加入-fno-objc-arc就可以为这个文件禁用ARC。
《ARC以及非ARC的讨论》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- Android开发之Toast
第一次在博客园发布文章,就把我刚弄明白的关于Android开发中的提示设置,分享给大家. Toast是Android中经常用到的一个方法,用于简单的用户提示,经过摸索我发现了Toast的两种使用方式, ...
- JavaScript之糟粕
0.导言 在上篇<JavaScript之毒瘤>中,列举了一些在JavaScript中难以避免的问题特性.本篇将会展示JavaScript中有问题的特性,但我们很容易就能便面它们.通过这些简 ...
- 使用karma测试平时写的小demo(arguments为例)
有人说前端自动化测试非常困难,我觉得确实如此.在项目中,我个人也不放心写的测试,还是要手动测试.但是我们平时写demo学习时,完全可以使用自动化测试. 传统demo 1,新建一个html 2,写入js ...
- Cesium原理篇:6 Render模块(3: Shader)
在介绍Renderer的第一篇,我就提到WebGL1.0对应的是OpenGL ES2.0,也就是可编程渲染管线.之所以单独强调这一点,算是为本篇埋下一个伏笔.通过前两篇,我们介绍了VBO和Textur ...
- AngularJs之Scope作用域
前言: 上篇博文AngularJs之directive中说了Scope作用域是个大坑,所以拿出来作为重点总结! 什么是scope AngularJS 中,作用域是一个指向应用模型的对象,它是表达式的执 ...
- springMVC学习笔记(二)-----注解和非注解入门小程序
最近一直在做一个电商的项目,周末加班,忙的都没有时间更新博客了.终于在上周五上线了,可以轻松几天了.闲话不扯淡了,继续谈谈springMvc的学习. 现在,用到SpringMvc的大部分使用全注解配置 ...
- Elasticsearch+Logstash+Kibana教程
参考资料 累了就听会歌吧! Elasticsearch中文参考文档 Elasticsearch官方文档 Elasticsearch 其他——那些年遇到的坑 Elasticsearch 管理文档 Ela ...
- jQuery-1.9.1源码分析系列(十一) DOM操作
DOM操作包括append.prepend.before.after.replaceWith.appendTo.prependTo.insertBefore.insertAfter.replaceAl ...
- ASP.NET MVC中获取URL地址参数的两种写法
一.url地址传参的第一种写法 1.通过mvc中默认的url地址书写格式:控制器/方法名/参数 2.实例:http://localhost:39270/RequestDemo/Index/88,默认参 ...
- cmd执行SQL语句
首先新建txt文本,复制粘帖以下内容,保存为cmd执行SQL.bat.注意是bat文件 osql -S 服务器名称 -d 数据库 -U 登录名 -P 密码 -i 盘符:\文件夹\文件.sql