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. GuavaCache学习笔记三:底层源码阅读

    申明:转载自 https://www.cnblogs.com/dennyzhangdd/p/8981982.html 感谢原博主的分享,看到这个写的真好,直接转载来,学习了. 另外也推荐另外一篇Gua ...

  2. 微信公众号 几种移动端UI框架介绍

    微信公众号开发,主要是移动端网页的页面开发,在这里推荐3个移动端UI框架:WeUI.SUI和Mint UI. 1. WeUI 1.1 WeUI WeUI是微信官方设计团队为微信 Web 开发量身设计, ...

  3. 用VS2012建立core2.1网站项目后引用Microsoft.AspNetCore.Session不了

    做个.NET CORE的新项目,和往常一样,VS2017新建CORE项目(CORE2.1),NUGET引入session,结果引入不了,说什么版本不对应的,把SESSION降了一个版本,可以安装上了, ...

  4. jpush在有网的情况下6002

    网络处理问题. https://www.jpush.cn/qa/?qa=2476/%E7%BD%91%E7%BB%9C%E6%AD%A3%E5%B8%B8%E7%9A%84%E6%83%85%E5%8 ...

  5. Java知多少(90)菜单

    有两种类型的菜单:下拉式菜单和弹出式菜单.本章只讨论下拉式菜单编程方法.菜单与JComboBox和JCheckBox不同,它们在界面中是一直可见的.菜单与JComboBox的相同之处是每次只可选择一个 ...

  6. No service of type Factory<LoggingManagerInternal> available in ProjectScopeService

    导入GitHub上下载的项目时报错 No service of type Factory<LoggingManagerInternal> available in ProjectScope ...

  7. FatTree拓扑结构

    FatTree拓扑结构是由MIT的Fares等人在改进传统树形结构性能的基础上提出的,属于switch-only型拓扑. 整个拓扑网络分为三个层次:自上而下分别为边缘层(edge).汇聚层(aggre ...

  8. Pycharm+Django搭建第一个Python Web程序

    1.安装django 无论是Python2.x还是Python3.x版本,都可以使用pip来安装Django.在控制台使用如下命令:pip install django 如: 2.检查dgango是否 ...

  9. iOS中 支付宝钱包具体解释/第三方支付 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博! iOS开发人员交流QQ群: 446310206 一.在app中成功完毕支付宝支付的过程 1.申请支付宝钱包.參考网 ...

  10. Android Studio开发第二篇创建新项目

    创建新项目很简单,File-New-New Project,这个没什么好说的跟Eclipse都差不都. 第二步SDK选择,有手机平板还有Wear,TV,汽车Auto,谷歌眼镜等几个种平台,这里就先选择 ...