前言
前些日子在搞flutter抓包的时候遇到过Core Foundation与Foundation之间的转换关系,如下:
//自动获取手机代理
NSDictionary *proxySettings = (__bridge NSDictionary *)(CFNetworkCopySystemProxySettings());
NSArray *proxies = (__bridge NSArray *)(CFNetworkCopyProxiesForURL((__bridge CFURLRef _Nonnull)([NSURL URLWithString:portalBaseUrlStr]), (__bridge CFDictionaryRef _Nonnull)(proxySettings)));
遂进行探究了下。
Core Foundation与Foundation对象的区别
Foundation对象是OC对象,使用Object-C语音实现,Core Foundation对象时C对象,使用C语言实现。两者之间可以通过__bridge、__bridge_transfer和__bridge_retained关键字进行桥接。
__bridge
- (void)bridge {
self.cfArray = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
NSMutableArray *arr = (__bridge NSMutableArray *)self.cfArray;
NSLog(@"bridge->step1++++%ld",CFGetRetainCount(self.cfArray));
CFRelease(self.cfArray);
NSLog(@"bridge->step2++++%ld",CFGetRetainCount(self.cfArray));
}
外部调用

结论:__bridge:Foundation与Core Foundation对象之间相互转换,只涉及对象类型不涉及对象所有权的转化。换句话说就是本来由ARC管理的Foundation对象用__bridge转换为Core Foundation对象之后依然由ARC来管理;本来手动管理的Core Foundation对象转换之后依然由手动管理。
__bridge_transfer
Core Foundation对象转换成Foundation对象
- (void)bridge_transfer {
self.cfMutableArray = CFArrayCreateMutable(kCFAllocatorDefault, 0, NULL);
NSMutableArray *arr = (__bridge_transfer NSMutableArray *)self.cfMutableArray;
NSLog(@"bridge_transfer->step1++++%ld",CFGetRetainCount(self.cfMutableArray));
CFRelease(self.cfMutableArray);
NSLog(@"bridge_transfer->step2++++%ld",CFGetRetainCount(self.cfMutableArray));
}
运行demo

结论:__bridge_transfer:用于Core Foundation对象转换为Foundation对象,并且进行内存管理权限的移交。换句话就是Core Foundation对象使用__bridge_transfer转换为Foundation对象后,原本由手动管理的移交给ARC管理。
__bridge_retained
Foundation对象转换成Core Foundation对象
- (void)bridger_retained {
self.mutableArray = [NSMutableArray array];
self.cfMutableArray = (__bridge_retained CFMutableArrayRef)self.mutableArray;
NSLog(@"bridge_retained->step1++++%ld",CFGetRetainCount((__bridge CFTypeRef)(self.mutableArray)));
CFRelease((__bridge CFTypeRef)(self.mutableArray));
NSLog(@"bridge_retained->step2++++%ld",CFGetRetainCount((__bridge CFTypeRef)(self.mutableArray)));
CFRelease((__bridge CFTypeRef)(self.mutableArray));
}
打印结果

外部调用

结论:__bridge_retained:用于Foundation对象转换为Core Foundation对象,并且进行内存管理的移交。换句话就是原本由ARC管理的Foundation对象使用__bridge_retained转换为Core Foundation对象后,原本由ARC管理的内存需要手动管理了。
网友评论