官方介绍:

https://developer.apple.com/library/mac/#documentation/Performance/Conceptual/ManagingMemory/ManagingMemory.html#//apple_ref/doc/uid/10000160-SW1

整个项目开启关闭ARC,需要在Building Setting中设置:

某个文件关闭ARC,只需对该文件设置:-fno-objc-arc

ARC机制基本规则:
delegate使用方法:@property (assign) <id>xxxDelegate delegate;
delegate和outlet 应该用 weak 属性来声明

在ARC机制下,彻底忘掉retain、release、retainCount和autorelease。以前我们在需要安全使用一个对象时,往往会将该对象retain住,在不需要的时候进行release。在ARC环境下这么做会有编译错误。

在@property声明中,用strong和weak代替相应的retain, copy,和assign。

int, BOOL用assign修饰
__weak 定义的变量一致,该属性所声明的变量将没有对象的所有权,并且当对象被破弃之后,对象将被自动赋值nil

使用ARC的一些强制规定:

  1. 不能直接调用dealloc方法,不能调用retain,release,autorelease,retainCount方法,包括@selector(retain)的方式也不行
  2. 可以用dealloc方法来管理一些资源,但不能用来释放实例变量,也不能在dealloc方法里面去掉[super dealloc]方法,在ARC下父类的dealloc同样由编译器来自动完成
  3. Core Foundation类型的对象仍然可以用CFRetain,CFRelease这些方法
  4. 不能再使用NSAllocateObject和NSDeallocateObject对象
  5. 不能在C结构体中使用对象指针,如果由类似功能可以创建一个Objective-C类来管理这些对象
  6. 在id和void*之间没有简便的转换方法,同样在Objective-C和core Foundation类型之间的转换都需要使用编译器制定的转换函数
  7. 不能再使用NSAutoreleasePool对象,ARC提供了@autoreleasepool块来代替它,这样更有效率
  8. 不能使用内存存储区(不能再使用NSZone)
  9. 不能以new为开头给一个属性命名
  10. 声明outlet时一般应当使用weak,除了对StoryBoard这样nib中间的顶层对象要用strong
  11. weak相当于老版本的assign,strong相当于retain

老版本的工程是可以转换成使用ARC的工程的,转换规则包括:

  1. 去掉所有的retain,release,autorelease
  2. 把NSAutoRelease替换成@autoreleasepool{}块
  3. 把assign的属性变为weak

其他文章:http://blog.csdn.net/zkdemon/article/details/7446385

dealloc方法的使用:

  • 已经开启了arc,dealloc还可以使用,只是在代码中中不能显示调用,在dealloc方法中不可以包含[super dealloc]。
  • 在dealloc中一般用来解除delegate,例如self.webView.delegate = nil;
  • 开始的时候注册了notification等,那么是需要在dealloc中把这些notification移除掉
  • 如果某个类没有调用dealloc方法,会导致内存泄露,这时要检查在该类内部是否有其他对象调用了该对象导致无法成功释放。

ARC内存使用注意事项的更多相关文章

  1. ARC内存管理机制详解

    ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数. ...

  2. iOS阶段学习第21天笔记(ARC内存管理-Copy-代理)

    iOS学习(OC语言)知识点整理 一.OC 中的ARC内存管理 1)ARC中释放对象的内存原则:看这个对象有没有强引用指向它 2)strong:强引用,默认情况下的引用都是强引用 3) weak:弱引 ...

  3. iOS学习笔记之ARC内存管理

    iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...

  4. Delphi中ARC内存管理的方向

    随着即将发布的10.3版本,RAD Studio R&D和PM团队正在制作Delphi在内存管理方面的新方向. 几年前,当Embarcadero开始为Windows以外的平台构建新的Delph ...

  5. iOS MRC ARC 内存管理

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

  6. 2016 - 2 - 19 ARC内存管理知识总结(一,arc基本概念及alloc等方法的实现)

    一. ARC的基本概念 1. 在objc中采用automatic reference counting 机制, 让编译器来进行内存管理.在降低程序崩溃,内存管理泄漏等风险的同时,很大程度减少了程序员的 ...

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

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

  8. iOS ARC内存管理

    iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...

  9. iOS开发ARC内存管理

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

随机推荐

  1. c#关于委托和事件

    using System; using System.Collections.Generic; using System.Text; namespace Delegate {     // 热水器   ...

  2. 毕业论文endnote使用

    毕业论文的参考文献的标准格式,参考了一下文章 http://blog.sina.com.cn/s/blog_62a1f43801016fq5.html http://blog.csdn.net/zhe ...

  3. Hibernate 笔记1

    Hibernate表generator标签的作用,如下图,

  4. Hibernate MySQL 数据库 使用别名 报 Column * Not Found

    使用Hibernate 查询MySQL数据表的时候报 Column Not Found ,原因是MySQL的驱动不支持别名, 解决方案如下,在连接参数中加上 useOldAliasMetadataBe ...

  5. AppCode3 常用 设置 及 快捷键 (持续更新)

    以下设置都可以通过 设置中的搜索框 进行关键字搜索 0, 打开Project 设置 Command + ; 1, 打开设置快捷键 Command + , 2, 显示行号 Editor -> Ap ...

  6. hdu 1395 2^x mod n = 1 (简单数论)

    题目大意: 求出一个最小的x 使得 2的x次方对n取模为1 思路分析: 若要 a*b%p=1  要使得b存在 则 gcd (a,p)=1. 那么我们应用到这个题目上来. 当n为偶数 2^x 也是偶数, ...

  7. HDU ACM 1066 Last non-zero Digit in N!

    #include<iostream> using namespace std; int mod[20]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2}; ...

  8. android平板Home键的监听

    关于android4.2平板Home键的监听 1.android4.0以上的平板Home键是不能屏蔽的,至少在应用层是这样.但是可以监听Home键的触发,主要是通过广播的监听来接受Hone键的触发广播 ...

  9. 文件操作中的FLAG(O_RDONLY,O_WRONLY )的值

    #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> void main(void) { ...

  10. java--线程的睡眠sleep()

    package MyTest; public class Demo1 extends Thread { public void run() { loop(); } public void loop() ...