内存管理之 ARC 和 自己主动释放池

一、ARC 中的变量全部权修饰符

变量修饰符,主要用来标识对象的生命周期.在手动内存管理方式中没有这些概念.

ARC 环境下变量全部权修饰符主要有以下几个:

__strong
__weak
__unsa_unretained
__autoreleasing

具体说明:

(1) 变量默认值都是__ strong 修饰

仅仅要强引用存在,对象就不能释放.当超过了对象的作用域以及没有强引用时,对象会自己主动销毁.

_strong 属性基本上能适应 ARC 环境下的全部情况.假设不写的话,默觉得_ strong 属性.

(2) __weak 不持有对象,仅仅是简单地引用而已.

也就是说,_weak不会影响对象的销毁,仅仅要__weak 修饰的对象没有强引用时,就会自己主动销毁,这时候_ weak 变量会自己主动设置成 nil.

以下是一个样例

  NSString *__weak str = [][NSString alloc] initWithFormat:@"I am studying"];
NSLog (@"str : %@",str);

由于 str 这个对象是弱引用,编译器会提示,这是一个弱引用,输出的结果: str:null

在你打开ARC时,你是不能使用retainrelease autorelease 操作的。原先须要手动加入的用来处理内存管理的引用计数的代码能够自己主动地由编译器完毕了。可是你须要在对象属性上使用weak 和strong, 当中strong就相当于retain属性,而weak相当于assign。基础类型还是使用assign。

二、自己主动释放池

  • 自己主动释放池是一个存放实体的集合,这些实体可能是对象,这些对象能够被自己主动释放.
  • (id)autorelease;// 是 NSObject提供的方法,此方法在某一个预定的时候,想对象发送 release 消息,返回值是接收消息的对象.实际上当给一个对象发送 autorelease 消息的时候,就是将这个对象加入到自己主动释放池( NSAutoreleasePool) 中,当自己主动释放池被销毁时,会向该池中的全部对象发送 release 消息
暂时对象和拥有对象

当使用如:arrayWithCapacity这种方法获取暂时对象的时候。你不必考虑内存释放问题。

[NSColor blueColor]; 单例对象,永远不会被销毁,可是你也不必考虑它的内存问题。

假设在你自己定义的类中依赖其他对象时,你须要重写dealloc方法。而且在这种方法中释放依赖的对象

假设在设计的循环体中会占用较多的内存空间。建议手动创建自己主动释放池。如:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
for ( int i = 0; i < 1000000; i++) {
id object = [someArray objectAtIndex:i];
NSString *desc = [object description];
// and do something with te descripton
if ( i % 100 == 0) {
[pool release];
pool = [[NSAutoreleasePool alloc] init];
}
}
APC 的本质
  • ARC 本质上是由编译器在编译阶段,在合适的地方插入 retain 和 release 方法.
  • ARC 是编译时的特性.
关于 ROP 和 non-ROP

全部权归属问题


NSString *theString = @"Hello,Henan";
CFStringRef cfString = (CFStringRef)theString // __bridge cfString = (__bridge CFStringRef)theString //指针的全部权不变,所以是 theString
// __bridge_retained
cfString = (__bridge_retained CFStringRef)theString// 指针的全部权对象是 cfString // __bridge_transfer cfString = (__bridge_transfer CFStringRef)theString// 指针的全部权属于 theString
使用 ARC 的一些强制规定
  1. 不能直接调用 dealloc 方法,不能调用 retain,release,autorelease,retainCount 方法,包含@ selector(retain) 的方法也不行.
  2. 假设你须要管理资源而不是释放实例变量,你应该事先 dealloc 方法.不能再 dealloc 方法里面去调[ super dealloc] 方法,在 ARC下父类的 dealloc 相同由编译器来自己主动完毕.
  3. Core Foundation 类型的对象仍然能够用 CFRetain,CFRealese 这些方法.
  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.

Objective-C 内存管理之 _ARC的更多相关文章

  1. Objective C内存管理之理解autorelease------面试题

    Objective C内存管理之理解autorelease   Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的A ...

  2. Objective C 内存管理[转]

    1  配对原则 alloc – release new – release retain - release copy – release 2  new和alloc-init的区别 (1)区别只在于a ...

  3. objective C 内存管理及属性方法具体解释

    oc为每一个对象提供一个内部计数器.这个计数器跟踪对象的引用计数,当对象被创建或拷贝时.引用计数为1.每次保持对象时,调用retain接口.引用计数加1.假设不需要这个对象时调用release,引用计 ...

  4. Objective -C Memory Management 内存管理 第一部分

    Objective -C Memory Management  内存管理  第一部分 Memory management is part of a more general problem in pr ...

  5. Objective-C(内存管理)

    引用计数器 每个OC对象都有一个占4个字节存储空间的引用计数器 当使用或创建一个对象时,新对象的引用计数器默认是1 retain:可以使引用计数器+1 release:可以是引用计数器-1 retai ...

  6. Objective C----手动管理内存和自动管理内存

    对象的引用计数(Reference Counting) 正常情况下,当一段代码需要访问某个对象时,该对象的引用的计数加1:当这段代码不再访问该对象时,该对象的引用计数减1,表示这段代码不再访问该对象: ...

  7. IOS学习笔记3—Objective C—简单的内存管理

    今天简述一下简单的内存管理,在IOS5.0以后Apple增加了ARC机制(Automatic Reference Counting),给开发人员带来了不少的方便,但是为了能更好的理解IOS内存管理机制 ...

  8. objective-c(内存管理)

    本文主要记录objective-c 内存管理的知识点: 1.objective-c的对象都是分配内存在堆上,与C的mallock和C++的new类似,只有int等系统变量分配内存在栈上: 2.obje ...

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

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

随机推荐

  1. Java application 性能分析分享

    性能分析的主要方式 监视:监视是一种用来查看应用程序运行时行为的一般方法.通常会有多个视图(View)分别实时地显示 CPU 使用情况.内存使用情况.线程状态以及其他一些有用的信息,以便用户能很快地发 ...

  2. (六)boost库之内存管理shared_ptr

    (六)boost库之内存管理shared_ptr 1.shared_ptr的基本用法 boost::shared_ptr<int> sp(new int(10)); //一个指向整数的sh ...

  3. rpm包下载网站

    摘自http://blog.sina.com.cn/s/blog_4942055d0100031a.html rpm包下载网站 http://www.rpmfind.net http://www.rp ...

  4. crm2011js操作选项卡和节点

    CRM窗口选项卡的操作 crm2011节点的操作

  5. android 实现静默安装、卸载

    方法1:[使用调用接口方法,由于安装卸载应用程序的部分API是隐藏的,所以必须下载Android系统源码,在源码下开发并编译之后使用MM命令编译生成APK文件] import java.io.File ...

  6. 【位运算DFS/DLX】【HDU1426】【数独】

    题意:标准的一道数独题 DFS做法: 将横纵九宫格里的数字用位运算状态压缩,且可以通过逻辑或来确定总共有哪些数字被选择了,很方便也很快,代码如下 #include <cstdio> #in ...

  7. C#通用权限管理-程序安全检查,这些你一定要考虑到位

    接触通用权限已经一年,现在使用已经很熟练,分享通用权限管理下面的一些好的开发思想. 安全漏洞对于一个小项目来说,可能不是特别的重视,对于一个大项目来说,这是特别重要需要注意的,特别是在项目开发中的就要 ...

  8. https配置

    总结了一下: 所谓用HTTPS的时候 app 前端要配置SSL 证书的意思就是:相当于服务器端与app 前端, 一个拿公钥,一个拿私钥.简单得说就是客户端发送请求的时候,用配置好的SSL证书里的加密方 ...

  9. 华为S5700基础配置----备份和恢复配置文件

    一:备份配置文件 设备作为FTP服务器,用户PC作为FTP客户端 # 配置设备的FTP功能及FTP用户信息. <HUAWEI> system-view [HUAWEI] ftp serve ...

  10. Spring IOC的配置使用(转)

    转:http://www.cnblogs.com/linjiqin/p/3408306.html Spring IOC的配置使用 1.1.1 XML配置的结构一般配置文件结构如下: <beans ...