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];
}

那么就产生了以下几个问题:

  1. MRR下实现了一个newObject方法,该方法遵守约定的原则,返回值会retain+1,然后在ARC下调用该方法创建对象
  2. MRR下实现了一个newObject方法,该方法没有遵守约定原则,返回autorelease的对象,然后在ARC下调用该方法创建对象
  3. ARC下实现了一个newObject方法,然后在MRR下调用newObject方法创建对象,使用完成之后release
  4. 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另类的内存管理的更多相关文章

  1. iOS夯实:内存管理

    iOS夯实:内存管理 文章转自 内存管理 最近的学习计划是将iOS的机制原理好好重新打磨学习一下,总结和加入自己的思考. 有不正确的地方,多多指正. 目录: 基本信息 旧时代的细节 新时代 基本信息 ...

  2. IOS开发的内存管理

    关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...

  3. IOS开发小记-内存管理

    关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...

  4. [转载]对iOS开发中内存管理的一点总结与理解

    对iOS开发中内存管理的一点总结与理解   做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作 ...

  5. iOS开发ARC内存管理技术要点

    本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...

  6. iOS MRC ARC 内存管理

    转自:http://www.jianshu.com/p/48665652e4e4 1. 什么是内存管理 程序在运行的过程中通常通过以下行为,来增加程序的的内存占用 创建一个OC对象 定义一个变量 调用 ...

  7. iOS开发ARC内存管理

    本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更不是垃 ...

  8. IOS开发之内存管理--dealloc该写些什么

    在非ARC开发环境中,dealloc是类释放前,清理内存的最后机会.到底那些变量和属性该释放呢,一些特殊的类(nstimer,observer)该怎么释放.需要注意的是不释放会引起内存泄露,过度释放也 ...

  9. (转)iOS开发ARC内存管理技术要点

    转自:http://www.cnblogs.com/flyFreeZn/p/4264220.html 本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automati ...

随机推荐

  1. bzoj1003 [ZJOI2006]物流运输

    1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6300  Solved: 2597[Submit][Stat ...

  2. 关于hbase的read操作的深入研究 region到storefile过程

    这里面说的read既包括get,也包括scan,实际底层来看这两个操作也是一样的.我们将要讨论的是,当我们从一张表读取数据的时候hbase到底是怎么处理的.分二种情况来看,第一种就是表刚创建,所有pu ...

  3. hdu2067

    如果i==j&&j-1>=0时候,f[i][j]=f[i][j-1]; 如果j==0时候,f[i][j]=1; 其他 f[i][j]=f[i-1][j]+f[i][j-1]; # ...

  4. 轻松入门React和Webpack

    最近在学习React.js,之前都是直接用最原生的方式去写React代码,发现组织起来特别麻烦,之前听人说用Webpack组织React组件得心应手,就花了点时间学习了一下,收获颇丰 <!-- ...

  5. s3c6410_时钟初始化

    参考: 1)<USER'S MANUAL-S3C6410X>第三章 SYSTEM CONTROLLER 2)u-boot/board/samsumg/smdk6410/lowlevel_i ...

  6. ubuntu下使用nethogs监控网络流量

    NetHogs是一款小巧免费的开源命令行工具,用来按进程或程序实时统计网络带宽使用率. 对于使用类似于“repo tool”.“depot_tools”等工具checkout源码时非常有用,可以查看当 ...

  7. Jquery动画效果--地铁站名指示等效果

    源码参考:源码爱好者--jQuery仿地铁线路指示灯效果,经修改和美化,特此记录一下. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tra ...

  8. 利用jQuery获取鼠标当前的坐标

    文字来源:http://www.smalluv.com/jquery_code_106.html jQuery获取当前鼠标坐标位置: <div id="testDiv"> ...

  9. MyEclipse 选中属性或方法后 相同的不变色了?

    MyEclipse 选中属性或方法后 相同的不变色了? myeclipse-->windows-->java-->Editor-->Mark Occurrences 把所有的框 ...

  10. Hbase的Observer

    hbase提供了类似于触发器的组件observer,类似于存储过程的endpoint. hbase中的observer分别三类,MasterObserver.RegionObserver.WALObs ...