iOS另类的内存管理
iOS的内存管理算是老生常谈的问题了,我们写iOS的时候无时无刻不在涉及到内存管理。从开始的MRR(manual retain-release)到后来ARC(Automatic Reference Counting),包括CoreFoundation的内存管理都遵守引用计数的基本原则。
基本的内存管理大家肯定都很熟悉,在这里主要说一点,其余的就不多说了。官方文档有这样的一段话
- You own any object you create
You create an object using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy” (for example, alloc, newObject, or mutableCopy).
大意就是说,如果你使用alloc/new/copy/mutableCopy这些开头的方法创建了一个对象,那么你就会拥有这个对象(retain)。当你不用的时候,你就需要手动的去release一次。
举一个例子,假设有一个方法,[STObject newObject]
我们应该这么使用,如果我们最后不release,就会导致Object被泄漏。
|
1
2
3
|
STObject *object = [STObject newObject];// do something[object release]; |
既然这样的话,我们也可以想象出如果我们要自己实现new开头的方法,我们需要如下代码
|
1
2
3
4
5
6
7
|
- (instancetype)newObject { return [[[self class] alloc] init];}+ (UIButton *)copyButton { return [[UIButton buttonWithType:UIButtonTypeCustom] retain];} |
那么就产生了以下几个问题:
- MRR下实现了一个newObject方法,该方法遵守约定的原则,返回值会retain+1,然后在ARC下调用该方法创建对象
- MRR下实现了一个newObject方法,该方法没有遵守约定原则,返回autorelease的对象,然后在ARC下调用该方法创建对象
- ARC下实现了一个newObject方法,然后在MRR下调用newObject方法创建对象,使用完成之后release
- ARC下实现了一个newObject方法,然后在MRR下调用newObject方法创建对象,使用完成之后没有release
我们可以自己编写以上的实验代码,然后测试。
最终测试结果如下:
- 场景1,3下运行正常
- 场景2下会crash
- 场景4下产生内存泄露
为什么场景2会crash呢?这是由于ARC下我们编译器如果看到你是以alloc/new/copy/mutableCopy等开头的方法创建了对象,则会在使用的最后插入一次release操作,由于返回的是autorelease的对象,又被release了一次,所以导致野指针。
场景4产生泄漏的原因也是一样,ARC下编译器发现该方法是new等开头的时候,方法结束的时候不会插入release语句,场景4使用的过程中,没有对newObject进行release,所以会产生泄漏。
如果我们仅使用MRR或者ARC的话,这种问题一般不会出现。这种问题的出现一般是当ARC/MRR混编的时候,由于一些编写的不规范导致的,所以在写代码的过程中,遵守规范是很有必要的。
如果我们自己编写alloc/new/copy/mutableCopy开头的方法的时候,MRR下一定不要忘了返回retain的对象,同样当我们使用alloc/new/copy/mutableCopy的方法创建对象的时候,也不能忘了在用完之后release。
如果我们有一段MRR的代码,提供了一个new开头的方法但是没有遵守规范,我们ARC下该怎么办呢?按照上面的结论,我们正常使用肯定会导致野指针的
在这里呢,如果能改代码当然把代码都改成遵守规范的最好,如果不能改源码的话,我们只能修改使用方。在这里提供一种方法:
|
1
2
|
SEL selector = NSSelectorFromString(@"copyObject");STObject *object = (STObject *)[STObject performSelector:selector]; |
大家可以尝试一下,然后思考一下为什么。
关于iOS的内存管理远远不止这些,本文中说的大家实际编码的过程中也很少遇到,仅仅当作知识的补充吧~
iOS另类的内存管理的更多相关文章
- iOS夯实:内存管理
iOS夯实:内存管理 文章转自 内存管理 最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 目录: 基本信息 旧时代的细节 新时代 基本信息 ...
- IOS开发的内存管理
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
- IOS开发小记-内存管理
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
- [转载]对iOS开发中内存管理的一点总结与理解
对iOS开发中内存管理的一点总结与理解 做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作 ...
- iOS开发ARC内存管理技术要点
本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...
- iOS MRC ARC 内存管理
转自:http://www.jianshu.com/p/48665652e4e4 1. 什么是内存管理 程序在运行的过程中通常通过以下行为,来增加程序的的内存占用 创建一个OC对象 定义一个变量 调用 ...
- iOS开发ARC内存管理
本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更不是垃 ...
- IOS开发之内存管理--dealloc该写些什么
在非ARC开发环境中,dealloc是类释放前,清理内存的最后机会.到底那些变量和属性该释放呢,一些特殊的类(nstimer,observer)该怎么释放.需要注意的是不释放会引起内存泄露,过度释放也 ...
- (转)iOS开发ARC内存管理技术要点
转自:http://www.cnblogs.com/flyFreeZn/p/4264220.html 本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automati ...
随机推荐
- .net Url重写
详细说明及下载dll源码路径: http://msdn.microsoft.com/zh-cn/library/ms972974.aspx 顺带上本人写的一个小例子:http://files.cnbl ...
- VC 运行时库 /MD、/MDd 和 /MT、/MTd
这里总结下他们的区别,后面的那个'd'是代表DEBUG版本,没有'd'的就是RELEASE版本了. 首先说/MT /MT是 "multithread, static version ” 意思 ...
- 在阿里云 CentOS 服务器(ECS)上搭建 nginx + mysql + php-fpm 环境
阿里云的云服务器(ECS)可以选择多种操作系统,打算用它运行 Drupal或者 WordPress ,你最好选择 Linux 系统,这篇文章的演示是基于阿里云的 CentOS 操作系统的服务器.我们在 ...
- s3c6410_时钟初始化
参考: 1)<USER'S MANUAL-S3C6410X>第三章 SYSTEM CONTROLLER 2)u-boot/board/samsumg/smdk6410/lowlevel_i ...
- vim编辑器编程配置
打开/etc/vim/vimrc 添加命令: set cindent "使用C样式的缩进 syntax on "语法高亮 set tabstop=4 set softtabs ...
- DPDK内存管理-----(一)初始化
1 前言 DPDK通过使用hugetlbfs,减少CPU TLB表的Miss次数,提高性能. 2 初始化 DPDK的内存初始化工作,主要是将hugetlbfs的配置的大内存页,根据其映射的物理地址是否 ...
- c#高效比对大量图片
比较图片的方法 以前传统的比较方式是遍历图片中的每一个像素,然后进行比对.这样的比对在少量图片的比对上虽然效率低一点,但是也没有什么不好.但是在大量图片比对的时候,过长的反应时间和对服务器比较高的消耗 ...
- 软件工程 speedsnail 冲刺4
2015-5-8 完成任务:学习了黑马android教学视频7.8.9集,对布局和计划做了调整: 遇到问题: 问题1 异常 Warning: Activity not started, its cur ...
- Windows2003屏蔽IP
1.打开本地安全策略 2.创建新的IP策略 去掉勾选向导 我们编辑 直接右键指派 指派可以看出来生效...网络已经不通了
- 【转】MySQL GRANT REVOKE用法
MySQL的权限系统围绕着两个概念: 认证->确定用户是否允许连接数据库服务器 授权->确定用户是否拥有足够的权限执行查询请求等. 如果认证不成功的话,哪么授权肯定是无法进行的. revo ...