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

objc2-metal-performance-shaders

为objc2绑定到MetalPerformanceShaders框架预留的crate名称

1个不稳定版本

使用旧的Rust 2015

0.0.0 2024年5月10日

#5#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,它提供Apple C blocks的绑定,这是Rust闭包的C等效物。

联系我们

随时在GitHub上 创建问题

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

目标

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

1. 完整的严谨性

这些crate的非协商目标是要完全“严谨”,这意味着 绝对不能让安全的Rust引起未定义的行为

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

  • 错误的方法调用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方法为安全)。

如果您的项目规模较大,您可以考虑逐步升级,在每个步骤中查看变更日志。对于最常见的情况,变更日志将包括有关如何升级的有用示例。

例如,您首先可以在Cargo.toml中使用 objc2 而不是 objc

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

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

许可证

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

正在进行使其也采用Apache许可证(版本2.0)的工作,请参阅这里

致谢/先例

此存储库是以下项目的合并,请参阅分叉的理由在此

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

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

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

无运行时依赖