对于ARC的一些理解心得

news/2024/7/20 13:24:36 标签: 内存管理, xcode, c/c++

     我们在开发的时候都知道有arc和mrc

     那么我们现看arc是什么:arc的全称是automatic reference counting (arc) 是一个编译期的技术,利用此技术可以简化objective-c编程在内存管理方面的工作量。

     arc在xcode4.2中引入,在mac os x v10.6,v10.7 (64位应用),ios 4,ios 5中支持,xcode4.1中不支持这个技术。

    我们使用的arc 其实是oc编译器的特性,而不是运行时特性或者垃圾回收机制,ARC做的是在代码编译是为你自动在合适的位置插入release或者autorelease,只要没有强指针指向对象,对象就会被释放掉。它分为两部分,一个是前段编译器,用来插入release或者retain。另一个是优化器,因为代码中可能会出现release的重复调用等等一些多余的情况,这时候优化器就会自动负责移除这些多余的指令,保证生成的代码的运行质量。

    这里插入一个对于NSZone的理解和简单介绍:arc模式中不可以调用nszone的方法。NSZone可以简单想象为一个内存池,alloc或是dealloc这些操作,都是在这个内存池中操作的。默认的NSZone的缺陷在于,它是全局范围的,时间一长,导致内存的碎片化,那么性能就会受到一些影响。我们一般用到这个类一般都是在字符串定义之后  有copyWithZone的方法调用。

   ARC中有很多限制和规定:

1.不能使用retain/release/retainCount/autorelease
使用ARC,内存管理由编译器来负责,无需写上面关键词

不能再使用nsautoreleasepool对象,arc提供了@autoreleasepool块来代替它,这样更加有效率。
2.在ARC环境下,使用alloc/new/copy/mutableCopy来生成/持有对象
copy/mutableCopy的使用需要copyWithZone的支持,如果没有,则不支持copy/mutableCopy
3.不能显示调用[super dealloc]
4.使用@autoreleasepool块来替代NSAutorealeasePool
5.不能使用内存存储区(不能再使用nszone)
6.对象变量不能作为C语言结构体的成员
7.显示转换id和void *
在不使用ARC时,下面的转化是正确的
id obj=[[NSObject alloc] init];
  void *p=obj;
如果使用ARC,上述转换就会报错,加__bridge转换
 id obj=[[NSObject alloc] init];
        void *p=(__bridge void*)obj;

8.声明outlet时一般应当使用weak,除了对storyboard 这样nib中间的顶层对象要用strong

9.weak 相当于老版本的assign,strong相当于retain

转载于:https://www.cnblogs.com/wangxiaoqi/p/6408283.html


http://www.niftyadmin.cn/n/1536056.html

相关文章

外挂编写完全攻略

外挂编写完全攻略 今天石器上不去,没法调程序,写篇文章给想学写外挂的朋友参考 一、编写外挂需要什么条件 1、熟练的C语言知识 目前的外挂大部分都是用BC或者是vc写的,拥有熟练的C语言知识是写外挂的基本条件; 2、具有很强…

Selenium+Java+Jenkins+TestNg

注意:各webdriver版本都有对应的浏览器版本 如果启动出现问题,可能是driver路径错误,需要使用System.setProperty("webdriver.firefox.bin", "firefox.exe路径"); 常用方法:   driver.get("http://www…

动态生成类_动态代理的几种实现方式及优缺点

一、文章要点提前知二、动态代理的本质1、首先了解一下动态代理类对应的class文件是什么时候生成的?首先通过一张图了解一下Java源文件实例对象的一个简单的流程:2、动态代理的本质 简述:通过一定的技术,省略源文件的编写&#xf…

扫一扫 功能

- (void)setupCamera { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 耗时的操作 // Device _device [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; // Input _input [AVC…

算出当前系统后某个月的日期_【美妆小课堂】美宝莲怎么通过批号看生产日期保质期?...

今天来说说平价好物美宝莲美宝莲绝对是我学生时期的最爱,平价又好用,在我心里一直是一颗超级优质大白菜!美宝莲FIT ME粉底液多小仙女会找代购在专柜购买,上面既没有粘贴中文标签,也没有标明确切保质期。在国外&#xf…

获得任何一个版本 Windows 的密码框密码

获得任何一个版本 Windows 的密码框密码。(呵呵,好拗口啊!啊!别扔番茄!!) ---------- 鼠标钩子函数的DLL ---------- 文件名: HookDll.asm -----------------------------------…

qt waitforreadyread返回假_Qt网络编程之简易聊天室,界面很nice

网络聊天室程序基于TCP的可靠连接(QTcpServer、QTcpSocket)一个服务器,多个客户端3. 服务器接收到某个客户端的请求以及发送信息,经服务器发给其它客户端 最终实现一个共享聊天内容的聊天室!效果展示:来源:https://mp.…

简单的JS+HTML+CSS达成图片轮播

css代码 *{ margin:0px auto; padding:0px; font-family:微软雅黑; font-size:14px;} html中的代码 <div style"width:1000px; height:250px; margin-top:30px"><img src"img/11.jpg" width"1000" height"250" /><img …