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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言list嵌套遍历「建议收藏」

    c语言list嵌套遍历「建议收藏」list::iteratoritor; //定义迭代器 listmyList1; listmyList2;list>bigList;myList1.push_back(“88”);myList1.push_back(“99”);myList2.push_back(“22”);myList2.push_back(“33”);bigLi

    2022年7月12日
    33
  • H5+个推实现消息推送服务

    H5+个推实现消息推送服务网上看了几篇教程都是比较老的版本了,根据前人的智慧,然后自己摸索了下,简单几步实现了在手机上推送自定义的消息。首先,在个注册个账号,开发阶段使用个人注册即可,个推注册地址注册完进入配置页面,对应用进行配置,框中的几个地方要特别注意注册时会要求填一个包名,这个就是H5中对应的包名,一定要对应起来,否则收不到推送消息。或者查看应用的标识一定要和下面的标识对应起来,这样才能接收到信息。…

    2022年5月29日
    51
  • 短信验证码的作用及安全性

    短信验证码的作用及安全性在每个人都可以参与编辑的Web2.0时代,人人都在使用和注册各种APP账号,而验证码短信就是必不可少的认证工具!所以,验证码短信逐步占据了短信行业中的重要份额。而短信验证码的作用是:1、作为身份凭证首先,验证码是商家给用户验证身份的一个凭证,通过手机短信发送验证码,是最普遍、最安全验证用户真实身份的方式。短信验证码广泛应用于用户注册、密码找回、登陆保护、身份认证、随机密码、交易确认等应用场景。2、…

    2022年7月14日
    19
  • acwing-1172. 祖孙询问(最近公共祖先)「建议收藏」

    acwing-1172. 祖孙询问(最近公共祖先)「建议收藏」原题链接给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n。有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系。输入格式输入第一行包括一个整数 表示节点个数;接下来 n 行每行一对整数 a 和 b,表示 a 和 b 之间有一条无向边。如果 b 是 −1,那么 a 就是树的根;第 n+2 行是一个整数 m 表示询问个数;接下来 m 行,每行两个不同的正整数 x 和 y,表示一个询问。输出格式对于每一个询问,若 x 是 y 的祖先则输

    2022年8月9日
    4
  • Redis雪崩效应的解决方案(转)[通俗易懂]

    Redis雪崩效应的解决方案(转)[通俗易懂]1、可以使用分布式锁单机版的话本地锁当突然有大量请求到数据库服务器时候,进行请求限制。使用所的机制,保证只有一个线程(请求)操作。否则进行排队等待(集群分布式锁,单机本地锁)。减少服务器吞吐量,效率低。保证只能有一个线程进入实际上只能有一个请求在执行查询操作也可以在此处进行使用限流的策略~2、缓存标记publicobjectGetProductListNew()…

    2022年9月14日
    0
  • 我离职了[通俗易懂]

    我离职了[通俗易懂]傻瓜,我们江湖再见

    2022年7月25日
    6

发表回复

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

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