博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARC 之内存转换
阅读量:6785 次
发布时间:2019-06-26

本文共 1476 字,大约阅读时间需要 4 分钟。

hot3.png

在iOS世界,主要有两种对象: Objective-C 对象 Core Foundation 对象

Core Foundation对象主要是有C语言实现的 Core Foundation Framework 的对象,其中也有对象引用计数的概念,只是不是 Cocoa Framework的 retain/release,而是自身的 CFRetain/CFRelease 接口

ARC autoreleasepool 它是如何工作的? OC中有GC(垃圾回收器)吗?

GC垃圾回收器,JAVA C# 学过JAVA和C#的人们都知道,堆中的内存是由虚拟机的一个独立的线程负责回收的,这个就叫做垃圾回收器!

oc中ARC autoreleasepool 就像GC一样 Person *p = [[[Person alloc] init] autorelease]; 自动释放池会在 1> 自动释放池的空间被耗尽 2> 自动释放池被释放的时候 回收所有标记为autorelease的对象发送release消息

下面看一段MRC代码 MRC代码 id obj = [[NSObject alloc] init]; void *p = obj; obj = p; [obj release];

Alloc了一个对象,引用计数是1,实际上是在链表中管理的 Retain 的时候,只是把计数+1,计数release是否要彻底释放掉内存

ARC代码 id obj = [[NSObject alloc] init]; void *p = (__bridge void )(obj); obj = (__bridge id)(p); 使用 __bridge 关键字可以实现id类型与void类型的相互转换

__bridge_retain关键字表示类型被转换时,其对象的所有权也将被变换后变量所持有 MRC代码如下: id obj = [[NSObject alloc] init]; void *p = obj; [(id)p retain];

__bridge_retain测试程序 void *p = 0; { Person *obj = [[Person alloc] init]; obj.name = @"liufan"; p = (__bridge void *)obj; } Person *tmp = (__bridge Person *)p; NSLog(@"class=%@ %p %@", [(__bridge Person *)p class], p, tmp.name);

__bridge_transfer 当想把本来拥有对象所有权的变量,在类型转换后,让其释放原先所有权的时候,需要使用 __bridge_transfer 关键字 MRC代码如下 赋值之前,所有权是p id obj = (id)p; Obj 的技术加1 [obj retain]; P bei [(id)p release];

总结:MRC和ARC转换 __bridge_retained 是编译器替我们做了retain操作 __bridge_transfer 是编译器替我们做了release操作 __bridge 只是单纯地执行了类型转换,没有进行所有权的转移 注意:如果转换的是CFArrayRef,仍然需要手动释放内存 动态内存分析工具 辅助解决方法:CMD+SHIFT+B

转载于:https://my.oschina.net/panyong/blog/204307

你可能感兴趣的文章
跨域获取图片并自行上传保存
查看>>
Junit,Mockito,PowerMockito 进行单元测试
查看>>
要通过面试,Lamdba要了解多少?
查看>>
vim介绍、颜色显示和移动光标、一般模式下复制、剪切和粘贴
查看>>
PHP安装
查看>>
mysql用户管理-常用sql-数据库备份恢复
查看>>
springcloud应用程序上下文层次结构
查看>>
UI2Code智能生成Flutter代码--整体设计篇
查看>>
<java8>Java8 Optional 的使用
查看>>
教你怎样使用Spring Boot开发邮件系统?
查看>>
JAVA springboot微服务b2b2c电子商务系统 (五)springboot整合 beatlsql
查看>>
沙龙报名 | 探索新零售时代的数字化创新
查看>>
spring security中当前用户信息
查看>>
[Golang软件推荐] RSA公私钥加解密(解决Golang私钥加密公钥解密问题)
查看>>
html-meta http-equiv设置网页指定时间跳转
查看>>
python 入门
查看>>
如何防止http请求数据被篡改
查看>>
MyEclipse 2013集成JRebel
查看>>
indexOf()
查看>>
go语言学习
查看>>