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. 第一部分:开发前的准备-第八章 Android SDK与源码下载

    第8章 Android SDK与源码下载 如果你是新下载的SDK,请阅读一下步骤了解如何设置SDK.如果你已经下载使用过SDK,那么你应该使用AVD Manager,来更新即可. 下面是构建Andro ...

  2. List 比较大小

    List<Player> lst = new List<Player>(); lst.Add()); lst.Add()); lst.Add()); lst.Add()); l ...

  3. 【Android】Eclipse快捷键精选

    1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了. 这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.x ...

  4. GNU make使用(二)

    [时间:2017-06] [状态:Open] [关键词:makefile,gcc,编译,shell命令,目标文件] 0 引言及目标 之前使用Makefile都是把源文件和目标文件放到同一个目录编译.近 ...

  5. Android开发(十八)——头部、中部、底部布局技巧

    头部.中部.尾部布局涉及到布局内容自适应,总结两个技巧: 第一种相对布局: <?xml version="1.0" encoding="utf-8"?&g ...

  6. Android Launcher分析和修改5——HotSeat分析

    今天主要是分析一下Launcher里面的快捷方式导航条——HotSeat,一般我们使用手机底下都会有这个导航条,但是如果4.0的Launcher放到平板电脑里面运行,默认是没有HotSeat的,刚好我 ...

  7. 【iCore1S 双核心板_FPGA】例程十一:Modelsim仿真实验

    实验现象: 通过仿真波形,分析输入与输出的关系,可以清晰的看到所添加信号波形的变化与程序所写的一致. 核心代码: module modelsim( input CLK_12M, output FPGA ...

  8. php5.6-lumen与php5.6-phalcon性能对比

    场景一: 两个框架简单输出helloworld phalcon:{QPS:7349,平均响应时间:124.11ms},lumen{QPS:1327,平均响应时间:721.54ms} QPS: phal ...

  9. Paypal Rest Api自定义物流地址(跳过填写物流地址)

    PayPal之前的Rest Api是不支持自定义物流地址的,最新升级版本的提供了这个服务(Payment Experience),大概步骤如下: 1.申请一个自定义的配置ID 自定义配置包括Logo, ...

  10. 嵌入式开发之hi3519---lvds ,mipi,camera sensor,/DVI/HDMI Interface

    http://blog.csdn.net/mao0514/article/details/54015466