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 接口
• 在iOS世界,主要有两种对象: - Objective-C 对象- Core Foundation 对象
• Core Foundation对象主要是有C语言实现的Core Foundation Framework 的对象,其中也有对象引用计数的概念,只是不是 Cocoa Framework的 retain/release,而是自身的CFRetain/ CFRelease 接口
项目的ARC&MRC之间的转换
非ARC代码
ARC代码
id obj = [[NSObject alloc] init];!void *p = (__bridge void *)(obj);! obj = (__bridge id)(p);!
• 使用 __bridge 关键字可以实现id类型与void*类型 的相互转换
• 使用 __bridge 关键字可以实现id类型与void*类型 的相互转换
__bridge_retain
• __bridge_retain关键字表示类型被转换时,其对象
的所有权也将被变换后变量所持有• MRC代码如下:
id obj = [[NSObject alloc] init];
void *p = obj; [(id)p 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);
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_transfer 关键字
• MRC代码如下
id obj = (id)p; [obj retain]; [(id)p release];
小结
• __bridge_retained 是编译器替我们做了retain操作
• __bridge_transfer 是编译器替我们做了release操作
• __bridge 只是单纯地执行了类型转换,没有进行所有权的转移
• 注意:如果转换的是CFArrayRef,仍然需要手动释放内存
• 辅助解决方法:CMD+SHIFT+B
• __bridge_retained 是编译器替我们做了retain操作
• __bridge_transfer 是编译器替我们做了release操作
• __bridge 只是单纯地执行了类型转换,没有进行所有权的转移
• 注意:如果转换的是CFArrayRef,仍然需要手动释放内存
• 辅助解决方法:CMD+SHIFT+B
© chenyilong. Powered by Postach.io