新浪微博 有道云笔记 麦库 EverNote Pocket Instapaper 更多

ARC 之内存转换

ARC 之内存转换


技术博客http://www.cnblogs.com/ChenYilong/ 
新浪微博http://weibo.com/luohanchenyilong 










 



ARC 之内存转换 
技术博客http://www.cnblogs.com/ChenYilong/新浪微博http://weibo.com/luohanchenyilong

 

Foundation对象&CoreFoundation对象 
• iOS世界,主要有两种对象: - Objective-C 对象Core Foundation 对象
 Core Foundation对象主要是有C语言实现的Core Foundation Framework 的对象,其中也有对象引用计数的概念,只是不是 Cocoa Framework retain/release,而是自身的CFRetain/ CFRelease 接口



项目的ARC&MRC之间的转换



ARC代码 

id obj = [[NSObject alloc] init];! void *p = obj;!
obj = p;!
[obj
 release];!
!



ARC代码 

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


__bridge_retain 

 __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代码如下 
id obj = (id)p; [obj retain]; [(id)p release];



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



自动释放池 
• 在程序运行时,当自动释放池被耗尽或者取消分 配时,会向所有调用autorelease的自动释放对象 发送一个release消息



提示 
• 将对象添加到数组和集合中时,引用计数会自动 加1,当从数组和集合中删除该对象时,引用计数 会自动减1 

© chenyilong. Powered by Postach.io
posted @ 2014-03-08 11:45  iTeaTime(技术清谈)  阅读(199)  评论(0编辑  收藏  举报