iOS 开发当中,自动引用计数已经是标准的内存管理方案。除了一些老旧的项目或者库已经没有人使用手动来管理内存了吧。

ARC无疑是把开发者从繁琐的保留/释放引用对象逻辑中解脱出来。但这并不是万事大吉了,ARC当中一些编译器规则我们必须清楚。

ARC编译器规则

1、不能实现或调用 retain、release、autorelease或者retainCount方法。这一限制不仅针对对象,对选择器同样有效。因此,[obj release]

  或者@selector(reatin)是编译器错误。

2、可以实现 delloc方法,但是不能调用它们(在一个Controller实现delloc方法以释放对通知的监听)。不仅不能调用其他对象的delloc方法,也不能滴啊用超类。[super delloc]是编译时错误。

  但你仍然可以对CoreFoundataion类型的对象调用CFRetain、CFRelease等相关方法。

3、不能调用NSAllocateObject 和 NSDeallocateObject方法。应该使用alloc方法创建对象。运行时负责回收对象。

4、不能再C语言的结构体内使用对象指针。

5、不能再id类型和void* 类型之间自动转换。如果需要,那么你必须做显示转换。

6、不能使用NSAutoreleasePool ,要替换使用autoreleasepool快。

7、不能使用NSZone内存区域。

8、属性访问器名称不能以new开头,以确保与MRC的互操作 性。

9、由于XCODE从5.0开始默认使用的是ARC,如果非要使用MRC可以针对某一个文件 Targets -> Build Phases -> Complie Sources.选择源文件mrcClass.m, 在编译标记(Compiler Flags)里填写 -fno-objc-arc

整个项目还要使用MRC,请这样设置 Targets->Build Settings -> Objective-C Automatic Refrence Counting ,把YES->NO。

以上是编译器规则,不按照此规则,你会看到编译器时不时爆红。虽然编译器可以帮助提醒错误代码,但是如果对这些规则事先了解的话会避免写出编译器不高兴的代码。

内存管理规则(4个)

1、你拥有所有自己创建的对象,如new, alloc,copy,mutablecopy

2、你可以用 MRC中的retain或者ARC中的__strong引用来拥有任何对象的持有关系。

3、在MRC中,但不再西药某一个对象时,你必须立即使用release方法来放弃对该对象的持有关系,而在ARC中则无需任何特殊操作。持有关系会在对象失去最后的引用(方法中的最后一行代码)时被抛弃。

4、一定不能抛弃原本并不存在持有关系的对象。

实际开发当中需要注意的地方:

1、Block,block块内如果引用了对象的属性,成员变量或者方法,Block会持有该对象。使用__weakSelf 修饰符或者__weakSelf __strongSelf dance技术避免因为使用Block产生的循环引用。

2、NSTimer,在一个对象中创建一个定时器,定时器默认会对该对象强引用。所以定时器用完之后要先invalided 然后置空。

3、Delegate,一般一个对象的代理会声明为weak 或者 assign,只要注意这点不会有太大问题。

4、NSNotification,一个对象向通知中心注册自己为监听者,一定要在合适的时候(一般是在控制器对象的delloc方法中)释放监听。否则会内存泄漏。

具体内容参看下一篇:

iOS ARC编译器规则和内存管理规则的更多相关文章

  1. iOS: ARC & MRC下string内存管理策略探究

    ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作 ...

  2. iOS经典面试题总结--内存管理

    iOS经典面试题总结--内存管理 内存管理 1.什么是ARC? ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release.在对象被 ...

  3. iOS开发ARC机制下的内存管理技术要点

    转载一篇: iOS开发ARC内存管理技术要点.ARC内存管理原则总结.iOS ARC内存管理总结 ARC内存管理机制 (一)ARC的判断准则: 只要没有任何一个强指针指向该对象,该对象就会被释放. ( ...

  4. iOS学习17之OC内存管理

    1.内存管理的方式 1> iOS应用程序出现Crash(闪退),90%的原因是因为内存问题. 2> 内存问题 野指针异常:访问没有所有权的内存,如果想要安全的访问,必须确保空间还在 内存泄 ...

  5. iOS学习之Object-C语言内存管理

    一.内存管理的方式      1.iOS应用程序出现Crash(闪退),90%的原因是因为内存问题.      2.内存问题:      1)野指针异常:访问没有所有权的内存,如果想要安全的访问,必须 ...

  6. 【原】iOS学习18之OC内存管理高级

    1.属性的内存管理 1> 属性的语义特性 2> assign下的属性内部实现 @property (nonatomic, assign) NSString *name; @synthesi ...

  7. iOS之Block总结以及内存管理

    block定义 struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(v ...

  8. iOS ARC也会有内存泄露

    本文转载至 http://blog.csdn.net/allison162004/article/details/38753219  iOS提供了ARC功能,很大程度上简化了内存管理的代码. 但使用A ...

  9. iOS开发系列—Objective-C之内存管理

    概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...

随机推荐

  1. 12C -- ORA-65048 ORA-65048

    创建common user的时候报错: $ sqlplus '/as sysdba' SQL*Plus: Release 12.2.0.1.0 Production on Tue Apr 18 11: ...

  2. Effective Java 第三版——44. 优先使用标准的函数式接口

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  3. Ubuntu 13.10 录音有特别大噪音解决办法

    现在物理机跑Ubuntu,平常的QQ只能在虚拟机里跑了:起初和别人QQ语音,别人能听到很大的噪音,以为是虚拟机的回音,属于正常现象,结果我用虚拟机里边的录音工具和Ubuntu里的录音工具测试一下,发现 ...

  4. 【iCore1S 双核心板_FPGA】例程六:状态机实验——状态机使用

    核心代码: module FSM( input CLK_12M, input FPGA_KEY, output FPGA_LEDR, output FPGA_LEDG, output FPGA_LED ...

  5. js 上一步 下一步 操作

    <a id="syb" href="#" style="display: block;" class="btn button ...

  6. Java知多少(28)super关键字

    super 关键字与 this 类似,this 用来表示当前类的实例,super 用来表示父类. super 可以用在子类中,通过点号(.)来获取父类的成员变量和方法.super 也可以用在子类的子类 ...

  7. java-信息安全(十六)-双向认证

    原文地址 http://snowolf.iteye.com/blog/510985 对于双向认证,做一个简单的描述. 服务器端下发证书,客户端接受证书.证书带有公钥信息,用于验证服务器端.对数据加密/ ...

  8. [AWS] User management

    IAM用户管理 Ref: AWS系列-创建 IAM 用户 Ref: AWS系列:深入了解IAM和访问控制 是什么? IAM enables you to control who can do what ...

  9. SpringBoot------如何将项目打成war包

    1.修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...

  10. 采用镜像的方法安装python第三方库

    转自:https://blog.csdn.net/s740556472/article/details/68557330 pip install --index https://pypi.mirror ...