在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