美文网首页iOS基础
iOS Core Foundation与Foundation对象

iOS Core Foundation与Foundation对象

作者: 青年别来无恙 | 来源:发表于2019-07-05 16:07 被阅读0次

前言

前些日子在搞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

结论:__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

结论:__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
结论:__bridge_retained:用于Foundation对象转换为Core Foundation对象,并且进行内存管理的移交。换句话就是原本由ARC管理的Foundation对象使用__bridge_retained转换为Core Foundation对象后,原本由ARC管理的内存需要手动管理了。

相关文章

网友评论

    本文标题:iOS Core Foundation与Foundation对象

    本文链接:https://www.haomeiwen.com/subject/nfrehctx.html