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


相关推荐

  • 机器学习之朴素贝叶斯分类算法

    机器学习之朴素贝叶斯分类算法一、数学知识相关1.独立事件–前提2.条件概率3.全概率公式4.贝叶斯公式5.朴素贝叶斯公式其中:P(A)叫做A事件的先验概率,即一般情况下,认为A发生的概率。 P(B|A)叫做似然度,是A假设条件成立的情况下发生B的概率。 P(A|B)叫做后验概率,在B发生的情况下发生A的概率,也就是要求的概率。P(B)叫做标准化常量,即在一般情况下,认为B…

    2022年10月15日
    1
  • [matlab]normrnd和randn的区别

    [matlab]normrnd和randn的区别normrnd 和 randn 中均适用于生成正态分布的随机数 区别在于 normrnd 可以自己指定均值 MU 和方差 sigma 而 randn 生成的是标准的正态分布 即 MU 0 sigma 1 R normrnd mu sigma generatesran

    2025年9月24日
    3
  • PKCS11接口解析「建议收藏」

    PKCS11接口解析「建议收藏」pkcs密码中间件位于上层应用和底层安全设备之间,应用基于PKCS#11标准接口开发各类应用程序。主要包括2个库主API库:提供给应用的PKCS11接口。 tokenDLL库:由主API库调用,完成从上向下到指定设备的套接。 安全密码设备:安全服务资源和实施的载体,完成具体安全功能支撑。表pkcs11函数接口 种类 函数 …

    2022年5月24日
    44
  • 《算法和数据结构》学习路线指引

    前WorldFinal选手对学习算法的一点总结。五张思维导图解决你的困惑

    2022年4月9日
    86
  • 拉姆达表达式启动一个线程

    拉姆达表达式启动一个线程publicstaticvoidmain(String[]args){Mythreadmythread=newMythread();newThread(()-&gt;mythread.r()).start();}staticclassMythread{publicvoidr(){intcount=0;for(inti=0;i&lt;=100;i++){S…

    2025年11月19日
    8
  • linux 句柄数限制_linux文件句柄数

    linux 句柄数限制_linux文件句柄数一个部署到linux下的中间件项目,当收到一个Client登录的时候,需要为这个Client打开四个文件,当进行多用户的大压力测试的时候,程序就出问题了:toomanyopenedfiles。网上一查,发现有人也碰到过类似的socket/File:Can’topensomanyfiles问题。在此总结一下这个问题,希望对后来之人有点帮助。解决之法:1,ulimit…

    2022年10月18日
    5

发表回复

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

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