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. SqlServer 2008的tempdb数据文件大小暴增处理

    tempdb数据文件暴增,导致服务器磁盘空间被耗尽! 1.查看tempdb的使用分配情况 use tempdb go SELECT top 10 t1.session_id, t1.internal_ ...

  2. CentOS 7 安装配置zabbix 3.2.8

    运行环境:CentOS 7.2 LNMP(已提前安装好此环境) 1.首先导入zabbix安装源# rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x ...

  3. 苹果App Store审核指南中文翻译(更新至140227)

    前言 感谢您付出宝贵的才华与时间来开发iOS应用程程序.从职业与报酬的角度而言,这对于成千上万的开发员来说一直都是一项值得投入的事业,我们希望帮助您加入这个成功的组织.我们发布了<App Sto ...

  4. FAL_CLIENT和FAL_SERVER参数详解

    FAL_CLIENT和FAL_SERVER参数详解 转载:http://openwares.net/database/fal_client_fal_server.html FAL_CLIENT和FAL ...

  5. Java和Scala语法比较

    类型推断 挑逗指数: 四星 我们知道,Scala一向以强大的类型推断闻名于世.很多时候,我们无须关心Scala类型推断系统的存在,因为很多时候它推断的结果跟直觉是一致的. Java在2016 年也新增 ...

  6. Android Launcher分析和修改2——Icon修改、界面布局调整、壁纸设置

    上一篇文章说了如何修改Android自带Launcher2的默认界面设置(http://www.cnblogs.com/mythou/p/3153880.html). 今天主要是说说Launcher里 ...

  7. rtrim() 函数 从字符串的末端开始删除空白字符!

    例子 在本例中,我们将使用 rtrim() 函数从字符串右端删除字符: <?php $str = "Hello World!\n\n"; echo $str; echo rt ...

  8. 【Unity】ShareSDK、SMSSDK的基本使用与常见问题

    概要 测试使用ShareSDK的一些常用功能.包括: 用微博帐号做第三方登录 获取用户的帐号详细信息 获取好友列表 分享功能 测试使用SMSSDK插件,包括: 导入插件,解决包冲突 短信登录功能:发验 ...

  9. 教你一招:笔记本安装mint18时,安装界面显示不全

    近日在给自己的笔记本安装mint18时,安装界面显示不全,就是安装时到了分区界面后看不到下一步. 很无奈.... 于是胡乱摸索,得到解决的办法. 按住键盘上的ALT键,用鼠标向上拖动安装的界面,最好是 ...

  10. http://www.cnblogs.com/chenmeng0818/p/6370819.html

    http://www.cnblogs.com/chenmeng0818/p/6370819.html js中的正则表达式入门   什么是正则表达式呢? 正则表达式(regular expression ...