Objective-C 内存管理之 _ARC

Objective-C 内存管理之 _ARC

大家好,又见面了,我是全栈君。

内存管理之 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.
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115910.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 写给新入IT的新人们

    写给新入IT的新人们

    2021年11月23日
    47
  • 阿里云 SSL证书部署(DigiCert 免费版 SSL)「建议收藏」

    阿里云 SSL证书部署(DigiCert 免费版 SSL)「建议收藏」阿里云DigiCert免费版SSL有效期一年,过期后需要重新部署SSL所以,不管是第一次部署SSL还是刚接手公司项目SSL就到期的小伙伴都可以看一下该文章,如果有疑问请把疑问写到评论区,我会一一回复问题,不断完善该篇文章

    2022年10月3日
    4
  • 深度学习-10:人工智能简史及三剑客

    深度学习-10:人工智能简史及三剑客深度学习-10:人工智能简史及三剑客CSDN专栏:机器学习&amp;amp;深度学习(理论/实践)1人工智能简史深度学习理论的突破和深度学习硬件加速能力的突破,使AI在模式识别、无人驾驶、智力游戏领域取得空前的成功。学术界和工业界全力以赴掀起人工智能的新一轮热潮。各大互联网巨头纷纷成立人工智能研究中心,唯恐在新一轮人工智能的竞赛被无情淘汰。如今,机器学习的应用已遍及人工智能的各个分支,如专…

    2022年9月30日
    4
  • Linux 入门学习之用户管理

    Linux 入门学习之用户管理

    2021年9月16日
    50
  • 盘点分布式文件存储系统____分布式文件存储系统简介

    盘点分布式文件存储系统____分布式文件存储系统简介在项目的数据存储中,结构化数据通常采用关系型数据库,非结构化数据(文件)的存储就有很多种方式,服务器本地存储、Nas挂载、ftp等等,今天就来盘点一下,分布式文件存储系统。一、分布式存储简介1、什么是分布式存储在开始介绍分布式存储之前,先了解一下,非分布式的存储方案。在单机时代,将文件直接存储在服务部署的服务器上——直连存储(DAS):存储和数据直连,拓展性、灵活性差。为了扩展,将文件和服务分离,通过网络连接——中心化存储(NAS、SAN):设备类型丰富,通过网络互连,具有一定的拓展.

    2022年6月10日
    76
  • 各位学弟学妹,别再看教材了,时间复杂度看这篇就好了[通俗易懂]

    各位学弟学妹,别再看教材了,时间复杂度看这篇就好了[通俗易懂]时间复杂度是学习算法的基石,今天我们来聊聊为什么要引入时间复杂度,什么是时间复杂度以及如何去算一个算法的时间复杂度一、刻画算法的运行时间某日,慧能叫来了一尘打算给他补习补习一下基础知识,只见克写了一段非常简单的代码一尘看老师有点生气,开始虚心请教了为了方便讨论,这里我们把每一条语句的执行时间都看做是一样的,记为一个时间单元①蓝色框的两条语句,花费两个时间单元②黑色框的一条语句,花费n+1个时间单元③红色框的两条语句,花费2*n个时间单元这不是.

    2022年5月15日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号