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)
上一篇 2022年1月28日 下午9:00
下一篇 2022年1月28日 下午9:00


相关推荐

  • Mantid项目使用教程

    Mantid项目使用教程

    2026年3月16日
    2
  • VC++ InvalidateRect

    VC++ InvalidateRect     该函数向指定的窗体添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。  BOOLInvalidateRect(  HWNDhWnd,//handleofwindowwithchangedupdateregion  CONSTRECT*lpRect,//addressofrectanglecoordinates  BOOLbEras

    2025年6月8日
    7
  • Date与时间戳的相互转换[通俗易懂]

    Date与时间戳的相互转换[通俗易懂]1、Date对象转换为时间戳Datedate=newDate();longtimes=date.getTime();System.out.println(times);效果如下:15088242832922、时间戳转换为Date日期对象longtimes=System.currentTimeMillis();Datedate=newDate(times);System.out.println(date);…

    2022年6月21日
    229
  • 使用javascript实现对于chineseocr的API调用「建议收藏」

    ChineseOCR在线API网页地址界面提供多种接口调用方式,比如在线调用、Javascriptapi调用、curlapi调用和pythonapi调用四种方式,本次使用javascriptapi调用的方式进行OCR识别在线Javascript工具在线工具网页链接在线Base64转化工具在线工具网页链接代码修改新增一个变量fill_with_base64_image接收图片的base64编码的字符串 将input内的<fill_with_base6.

    2022年4月6日
    38
  • 超酷汇编教程-- 简明x86汇编语言教程(1)

    超酷汇编教程-- 简明x86汇编语言教程(1)第○章写在前面我不想夸大或者贬低汇编语言。但我想说,汇编语言改变了20世纪的历史。与前辈相比,我们这一代编程人员足够的幸福,因为我们有各式各样的编程语言,我们可以操作键盘、坐在显示器面前,甚至使用鼠标、语音识别。我们可以使用键盘、鼠标来驾驭“个人计算机”,而不是和一群人共享一台使用笨重的继电器、开关去操作的巨型机。相比之下,我们的前辈不得不使用机器语言编写程序,他们甚至没有最简单的汇编程序来

    2022年6月21日
    27
  • win10恶意软件删除工具[通俗易懂]

    win10恶意软件删除工具[通俗易懂]win+r,输入mrt弹出操作界面点击下一步,根据需要进行扫描,扫描完成后根据情况进行处理

    2022年6月24日
    45

发表回复

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

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