问题标签 [toll-free-bridging]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - 为什么 Swift Dictionary 不可桥接?
Dictionary 是一种桥接类型,为什么我可以从 Swift 字典切换到 NSDictionary 而不是相反?(编译错误:NSDictionary 不能转换为 'Dictionary')
根据苹果的文档:
所有 NSDictionary 对象都可以桥接到 Swift 字典,因此 Swift 编译器在导入 Objective-C API 时将 NSDictionary 类替换为 [NSObject: AnyObject]。
ios - 从 Class 方法赋值会绑定类而不是其返回值
我注意到我目前正在编写的代码的行为有些奇怪,我想我会在这里询问我是否正在做一些会导致这种情况发生的愚蠢的事情。
基本上,当我将一个变量分配给我的类方法的返回值时,它不是持有对返回值的引用的变量,而是持有对类的引用。请看下面的代码:
其中有一个方法签名
并返回
如您所见,我正在使用免费桥接来使用 CoreFoundation 对象,因为我正在收集一些网络接口的 IP 地址列表。
分配到之后newAddresses
,我查看newAddresses
LLDB 中数组的类并得到:
(lldb) po [newAddresses 类]
MyHost
我对我如何使用的假设有误__bridge_transfer
吗?所有用来组成的物体ipAddresses
都是CFStringRefs
。
编辑:我被要求提供整个方法,所以就在这里!
swift - CFDictionary 不会桥接到 NSDictionary (Swift 2.0 / iOS9)
好的,这是我在使用 CGImageSource 时遇到的一个案例,并注意到 CFDictionary 和 NSDictionary 之间的免费桥接在某些情况下似乎遇到了问题。我设法构建了以下示例来说明我的意思:
相当简单(也有点傻),但它是一个返回函数和可选的 CFDictionary。当试图从这个函数创建一个 NSDictionary 时,“乐趣”就开始了:
为什么以下不起作用?
虽然这工作正常?
XCode 7.0 (7A220)
objective-c - ObjC 使用免费桥接类型铸造一个块
是否可以将采用具有免费桥接等效物的 Objective-C 类型的块直接传递到期望具有 C 类型的块的方法中?
具体例子
我根据可用性包装了 AddressBook 和 Contacts API,并且框架包含两种方法,它们的所有意图和目的都是相同的。考虑完成块参数:
CNContactStore
的- (void)requestAccessForEntityType:(CNEntityType)entityType completionHandler:(void (^)(BOOL granted, NSError *error))completionHandler
和
AddressBook
的void ABAddressBookRequestAccessWithCompletion ( ABAddressBookRef addressBook, void(^)(bool granted, CFErrorRef error) completion );
我有一个类型块,void (^)(BOOL granted, NSError *error)
如果我可以将它传递给ABAddressBookRequestAccessWithCompletion(...)
. 我知道我可以将我的“objc”块包装在一个将“C 类型”作为参数的块中,但是当这些类型是免费桥接时,这样做是没有意义的。
具体问题
有没有办法将类型的对象void (^)(BOOL granted, NSError *error
转换为 type void(^)(bool granted, CFErrorRef error)
?如果可以,语法是什么?ARC 环境中所有权的含义是什么?
nsdata - (__bridge__transfer NSData*) 返回 _NSCFArray 而不是 NSData
我有一些用于钥匙串管理的代码。SecItemCopyMatching方法以名为foundDict的 (CFTypeRef *) 类型返回结果,该结果作为对 SecItemCopyMatching 方法的引用传递。然后我使用(__bridge_transfer NSData*)从 CFTypeRef* 桥接到 NSData* (到“结果”变量)。所以我期待结果变量当然是 NSData 类型,因为我是这样声明的,并使用桥将 CFTypeRef* 转换为 NSData*。但是当我想使用 NSString 方法将 NSData 转换为字符串时:initWithBytes:length:encoding,我得到一个运行时错误,告诉我“ [__NSCFArray bytes]: unrecognized selector set to instance.. ”
当我在 Xcode 中查看调试器时,我可以看到它为什么会抱怨,因为在“bridge”语句之后,“result”变量已从 NSData 转换为 __NSCFArray。而且由于 __NSCFArray 是一种数组类型,它不支持称为“字节”的方法,因此运行时会抱怨
所以,我不明白为什么在内部发生这种转换是从 NSData 到 __NSCFArray 最重要的是,如何将 CFTypeRef 类型的“SecItemCopyMatching”返回的结果转换为 NSData。有趣的是,我遵循 Apple 在KeychainWrapper 示例代码的钥匙串包装示例中建议的完全相同的代码
有什么想法吗?
我附上了调试器的图像:
swift - Swift 的字符串、数组和字典是 NSObject 吗?为什么结构可以是 NSObject?
我NSKeyedArchiver.archivedDataWithRootObject(obj)
用来将对象转换为NSData
. 该archivedDataWithRootObject(obj)
方法要求其参数为NSObject
,符合NSCoding
。
我尝试归档 Swift String
s、Array
s 和Dictionary
s,并且效果很好。所以我认为String
是NSObject
符合NSCoding
.
我还在操场上检查了这段代码,以确认它String
是NSObject
:
但是当我导航到String
的定义(使用 Cmd + 单击)时,它显示这String
是一个struct
. 我找不到显示它String
是NSObject
.
那么,为什么在String
定义中,我找不到显示它的String
代码NSObject
?为什么结构可以是一个NSObject
?
linux - 在 Linux 上与 CoreFoundation 进行桥接
我正在尝试在同时使用 CoreFoundation 和 Foundation 的 Linux 上编译一些代码,但 Linux 并没有像 macOS 和 iOS 那样实现桥接。
Objective-C 和 Swift 之间的桥接工作:
但我不知道如何连接到 CoreFoundation。我不能只将 a 传递NSString
给需要 a 的函数CFString
:
我不能像在 macOS 上那样投射它:
使用as!
错误消息建议编译,但会导致运行时崩溃 ( Illegal instruction
),并as?
产生错误:
Bridging.swift
具有用于在 NS 和 CF 类型之间转换的协议,并且许多类型具有初始化程序和属性,但这些都是internal
or private
。我可以只使用CFStringCreateWithCString
,但这需要与其他类对一起使用InputStream
和CFReadStream
。
我在这里遗漏了什么,还是真的没有办法在 Linux 上的 Foundation 和 CoreFoundation 类型之间进行转换?
objective-c - 为什么对具有自定义内存管理语义的集合使用免费桥接?
在书里
有效的 Objective-C 2.0:改进 iOS 和 OS X 程序的 52 种特定方法
有一个
第 49 条:对具有自定义内存管理语义的集合使用免费桥接
本章主要通过一个示例解决了在 NSDictionary 中复制键而保留值的问题,从而说明了免费桥接的重要性。
它说,我引用如下:
如果您想用作键的对象无法复制怎么办?
我的问题是,如果 Objective-C 中的所有对象都是从一开始就实现复制方法的 NSObject 的子类,那怎么会有无法复制的对象呢?是否有任何实际情况需要这种情况?
automatic-ref-counting - CFBridgingRelease 是否在没有直接分配的情况下将所有权恢复到预先存在的引用?
如果我有以下代码:
在调用?后将texture
再次有效并由 ARC 保留share_ptr_with_native()
swift - 为什么 NSSpeechsynthesier 的类方法 availableVoices 不能桥接到 Swift 字符串数组?
在 Apple 的Working with Cocoa Frameworks中,它读起来好像 Foundation 和 Swift Foundation 框架通过桥接一起工作。但是,我注意到在尝试使用 NSSpeechSynthesizer 的类方法 availableVoices() 时,它允许我接收返回的 NSStrings 数组,但不能接收 Strings。
这编译并运行得很好:
但是,这不会编译:
如果voiceName 文档显示 VoiceName 是一个字符串属性,为什么这不起作用?
我在 VoiceName 文档中看到了“rawValue”一词,那么推理是否与某种枚举有关?