内存管理之 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. HttpClient post 请求实例

    所需jar包: commons-codec-1.3.jar commons-httpclient-3.0.jar commons-logging-1.1.1.jar /** * */ package ...

  2. haproxy path_end不能忽略

    C:\>ping www.zjtest7.com 正在 Ping www.zjtest7.com [192.168.32.82] 具有 32 字节的数据: 来自 192.168.32.82 的回 ...

  3. OpenStack securityGroup rule Set

    OpenStack DBaas 云数据即服务之☞troveError

  4. SAE利用storge上传文件 - myskies的专栏 - 博客频道 - CSDN.NET

    SAE利用storge上传文件 - myskies的专栏 - 博客频道 - CSDN.NET SAE利用storge上传文件

  5. MySQL初始化故障-----mysql_config_editor中的坑

    今天准备新启一个MySQL实例,结果竟然无法初始化,内容如下: -------------------------------------------------------------------- ...

  6. 【精度问题】【HDU2899】Strange fuction

    Strange fuction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. Js闭包的用途

    本来想总结一点JavaScript中的闭包的一些用法,在查资料的时候发现了一篇很好的文章,就转过来收藏了,下面附上传送门: js闭包的用途 ---------sunlylorn 我们来看看闭包的用途. ...

  8. UVA 12545 Bits Equalizer

    题意: 两个等长的字符串p和q,p有‘0’,‘1’,‘?’组成,q由‘0’,‘1’组成.有三种操作:1.将‘?’变成0:2.将‘?’变成‘1’:3.交换同一字符串任意两个位置上的字符.问有p变到q最少 ...

  9. UVA 10603 Fill

    题意: 题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量.一开始只有第三个水杯是满的,剩下的水杯是空的.倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满. ...

  10. MSMQ是什么?

    MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位 ...