#objc2 #objective-c #framework #bindings #foundation #name #apple

objc2-core-foundation

为objc2绑定到CoreFoundation框架保留的crate名称

1个不稳定版本

使用旧的Rust 2015

0.0.0 2024年5月4日

#8#objc2

MIT 许可证

1KB

Rust + [Obj-C]
Rust中的Objective-C

License CI

你可能感兴趣的crate是

  • objc2,它提供了Rust和Objective-C之间的双向互操作性,包括在Rust中定义Objective-C类的支持。
  • objc2-* crate,它提供了自动生成的Apple Objective-C框架接口(如AppKitFoundationMetalWebKit等,你提到的我们几乎都打算提供)。
  • block2,它提供了对苹果C块的绑定,这是Rust闭包的C等效物。

联系我们

随时可以在GitHub上 提出问题

如果你更喜欢更同步的讨论,我们有一个 Matrix工作区,你可以在“用户”房间中提出任何问题。

目标

在像这样的开源项目中有很多冲突的优先级(性能、易用性、可理解性、可移植性等),但以下两个可以被视为本项目中所有其他内容的指导原则。

1. 完整的稳定性

这些crate的不可协商的目标是完全“稳定”,这意味着它 绝对不能让安全的Rust导致未定义的行为

截至2023年1月,我(@madsmtm)还没有发现任何一个Rust crate或项目在调用Objective-C时是稳定的。我发现的问题包括

  • 错误的方法调用ABI。
  • 错误的内存管理(在最好的情况下,它们只是大量泄漏)。
  • 错误的&mut使用。
  • 主线程不安全性。

我并不是为了对这些项目进行抨击而提出这一点,这是完全可以理解的!Objective-C 和 Rust 的语义差异很大,因此解决这些问题需要警惕和专注,比如一个系统剪贴板包就做不到这一点!相反,我提出这一点是为了提供保证:Rust 的无畏并发能力可以重新获得!本项目对问题的处理方法是有效的,并且内存泄漏、段错误、竞态条件等问题可以完全消除

不言而喻,没有什么是完美的,所以如果您认为您发现了一个安全性漏洞,请不要犹豫,在问题追踪器上报告它。已知的漏洞(无论理论与否)都记录在I-unsound标签下。

2. Rust 习惯用法

如果我们只是将每个 API 都标记为 unsafe 并就此了事(这实际上是前一个版本 objc 的做法,基本上是安全的),那么安全性就很容易实现了。然而,这只会将负担推给用户,我们并没有因此变得更好!

因此,我们将尽可能做到既安全又符合习惯用法;使用引用而不是指针来表示对象及其可变性,使用 Option 而不是 null,自动进行内存管理而不是手动管理,等等(请参阅关于“分层安全”的这些注释)。这些抽象最好是零成本的,但这当然是在易用性和效率之间进行权衡。

objc2block2 中的一些 API 仍然需要保持 unsafe,因此这些包含详细的 # Safety 部分,以让您确切知道需要维护哪些安全保证。框架包在这方面有些困难,因为它们大多是自动生成的,这意味着几乎没有什么可以默认安全!然而,我们仍然可以通过手动标记经过审计的功能为安全来减轻这个问题(我们需要您的帮助)。

最低支持的 Rust 版本 (MSRV)

目前最低支持的 Rust 版本是 1.60;这并不是由政策定义的,所以它可能会在补丁版本中随时更改。

请帮助我们定义#203 中的政策。

objc 和家族迁移

如果您项目的规模相对较小,最简单的方法可能是直接跳到使用框架包来替换所有内容(当您这样做时,不要忘记将您使用的 unsafe 方法标记为安全)。

如果您的项目规模较大,您可以逐步进行升级,在每一步都查看变更日志。对于最常见的情况,变更日志将包括一个有用的示例,说明如何升级。

例如,您可以从将 objc2 用于 Cargo.toml 中的 objc 开始。

[dependencies]
objc = { package = "objc2", version = "0.2.7" }

之后,您可以升级到下一个版本,在本例中是 v0.3.0-alpha.0,并根据变更日志对代码进行必要的更改。依此类推,每个后续版本都是如此。

许可协议

本项目采用MIT许可证,请参阅LICENSE.txt

目前正在努力使其同时获得Apache许可证(版本2.0)的双重许可,请参阅此处

致谢/先有技术

该仓库是以下项目的合并,请参阅分支理由在此

这些几乎完全由@SSheldon创建,因此对他们在这方面的出色工作表示衷心的感谢!

本项目还受到了以下项目的启发

最后,这绝对不是第一个尝试与Objective-C互操作的项目;其他语言也尝试过(成功程度不同)

  • Swift:从一开始就是为Objective-C互操作而构建的,是objc2希望与之具有功能对等的语言(尽管可能永远达不到)。真正设计得美妙的语言!
  • C#:Xamarin,Xamarin.Mac,是“应该可以工作”的良好灵感来源。
  • Python:PyObjC(之前?)官方Apple项目,与“BridgeSupport”一起工作,现在他们还通过调用Clang生成元数据。其他包括objprubicon.objc
  • Ruby:MacRuby,RubyCocoa
  • Dart:ffigen
  • Kotlin:具有一些内置支持
  • Nim:具有一些内置支持darwinobjc
  • D:具有一些内置支持derelict
  • Java:Java-Objective-C-BridgeMulti-OS Engine: Nat/J(还有一个生成器),Apple还有一个非常古老的官方项目。
  • Node.js:NodObjCobjc
  • Zig:zig-objcrt
  • D:具有一些内置支持derelict
  • 版本:实际上并不存在,他们只是编写和编译Objective-C代码,并使用手动C绑定。
  • Go: MacDriver

无运行时依赖