为什么 Objective-C dispatch_group_create() 可以返回 NULL 而不能返回 Swift DispatchGroup()?

Why can Objective-C dispatch_group_create() return NULL but not Swift DispatchGroup()?

提问人:user16217248 提问时间:4/11/2023 更新时间:4/12/2023 访问量:96

问:

我注意到用于调度组的 Swift API 和 Objective-C API 之间存在差异。

DispatchGroup() 的 init() 返回一个非可选值。

但是 Objective-C dispatch_group_create() 提到了返回的可能性:NULL

返回值

新创建的组,或失败时为 NULL。

  • 什么可能导致 Objective-C 函数失败?哪些幕后问题可能导致无法创建组?
  • 为什么 Swift 版本不是可选的,而 Objective-C 版本是可选的?如果创建可能因任何原因而失败,为什么这些相同的原因不适用于 Swift?
swift objective-c 调度组

评论

1赞 HangarRash 4/11/2023
看起来确实很奇怪。有人会认为 Swift 只是 Objective-C 的包装器。DispatchGroupdispatch_group_t

答:

2赞 matt 4/12/2023 #1

在 Objective-C 中,任何对象引用都可以是 ,并且对对象初始值设定项的任何调用都必须处理可能返回的可能性。nilnil

因此,在 Swift 中,理论上每个 Objective-C 对象都需要是一个 Optional——在 Swift 1 中确实如此:它们都是隐式解包的 Optionals。不过,后来,Swift 中的每一个 Objective-C 对象引用都被手动调整为普通的 Optional 或普通的 Non-Optional,这取决于它是否真的可以。nil

好吧,当你调用时,你得到的对象在理论上可以是,事实上它永远不会是。Swift 样式的 DispatchQueue 代码的创建者知道这一点,因此 DispatchGroup 初始值设定项不可为 null。dispatch_group_create()nil

评论

0赞 user16217248 4/12/2023
那么,如果它永远不会失败,为什么文档会说“失败时为 NULL”呢?
1赞 matt 4/12/2023
我想这就是我刚才解释的。任何Objective-C 初始值设定项可以在失败时返回 NULL。这并不意味着它会,而且(非常旧的)文档的工作不是担心这种区别。所有 Objective-C 代码都会检查它是否得到 .nil
1赞 Rob Napier 4/12/2023
例如,ObjC 考虑了内存可能耗尽且无法初始化所需数据结构的可能性。在实践中,在 ObjC 中实际处理内存耗尽基本上是不可能的,也没有人真正这样做,但它被认为是合法的非致命故障。Swift 不认为内存耗尽是可恢复的错误。
1赞 Rob Napier 4/12/2023
此外,无需猜测。libdispatch 是开源的:github.com/apple/swift-corelibs-libdispatch/blob/...
0赞 user16217248 4/12/2023
@RobNapier 根据链接的源,它们似乎访问对象指针的成员,而不检查它是否是 。因此,如果它失败了,无论如何都会调用未定义的行为。NULL