1 个不稳定版本
使用旧的Rust 2015
0.0.0 | 2024年5月18日 |
---|
#6 in #objc2
1KB
Rust中的Objective-C
你可能感兴趣的crate是
objc2
,它提供了Rust和Objective-C之间的双向互操作,包括在Rust中定义Objective-C类的支持。objc2-*
crate,它提供了对苹果Objective-C框架(如AppKit
、Foundation
、Metal
、WebKit等)的自动生成的接口(我们旨在拥有它)。
block2
,它提供了对苹果C块的绑定,这是Rust闭包的C等价物。
联系我们
请随时在GitHub上 提交问题。
如果你更喜欢更同步和不太“正式”的讨论,我们有一个 Matrix工作空间,在“用户”房间中随时提问。
目标
在像这样的开源项目中,有许多冲突的优先级(性能、易用性、可理解性、可移植性等),但以下两个可以被视为本项目中其他一切指导原则。
1. 完全正确性
这些crate的非协商性目标是完全“正确”,这意味着它 绝对不可能让安全的Rust产生未定义的行为!
截至2023年1月,我(@madsmtm
)还没有发现一个Rust crate或项目能够安全地调用Objective-C。我发现的问题包括
- 错误的方法调用ABI。
- 错误的内存管理(在最好的情况下,它们只是泄漏很多)。
- 错误的
&mut
使用。 - 不正确的主线程安全性。
我并不是要贬低这些项目,这是完全可以理解的!Objective-C和Rust有非常不同的语义,解决这些问题需要警觉性和关注,例如系统剪贴板crate就做不到这一点!相反,我这样说是为了提供保证:Rust的无畏并发可以重新夺回!本项目对问题的方法 有效,泄漏、段错误、竞态条件等问题 可以完全消除!
不用说,没有什么完美无缺的,所以如果你认为你发现了一个稳健性问题,请毫不犹豫地在 问题跟踪器 上报告它。已知的稳健性问题(无论理论如何)都记录在 I-unsound
标签下。
2. Rust 习惯用法
如果我们只是将每个 API 标记为 unsafe
并就此结束(此前的 objc
基本上是稳健的),那么实现稳健性就会变得容易。然而,这仅仅是将负担转移给了用户,我们并没有比以前更好!
因此,我们将尽可能地做到既安全又符合习惯用法;使用引用而不是指针来表示对象及其可变性,使用 Option
而不是 null
,自动进行内存管理而不是手动管理,等等(请再次参阅 有关“分层安全性”的这些说明)。这些抽象理想上应该是零成本的,但当然,这是在易用性和成本之间的一种平衡。
objc2
和 block2
中的一些 API 仍然必须保持 unsafe
,因此这些包含详尽的 # 安全性
部分,以让您确切知道需要遵守哪些安全性保证。框架存档在这方面有点困难,因为它们主要是由自动生成的,这意味着几乎没有什么可以默认为安全的!然而,我们仍然可以通过手动标记经过审计的功能为安全来尝试减轻这个问题(我们 需要您的帮助)。
最小支持的 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)授权,请参阅 此。
致谢/先例
此存储库是以下项目的合并,有关分叉的理由,请参见此处
objc
- 重命名为
objc2
。
- 重命名为
objc-encode
- 重命名为
objc2-encode
。
- 重命名为
objc_exception
- 移动到
objc2::exception
。
- 移动到
objc_id
- 移动到
objc2::rc
。
- 移动到
objc-foundation
- 重命名为
objc2-foundation
。
- 重命名为
block
- 重命名为
block2
。
- 重命名为
这些主要是由@SSheldon创建的,因此对他们在这些crate上的出色工作表示衷心的感谢!
本项目还受到了以下项目的启发:
apple-sys
cacao
core-foundation-rs
项目fruity
metal
objrs
objr
及其家族rust-macios
uikit-sys
和@simlay
的 Objective-C 上的bindgen
工作cidre
最后,这绝对不是唯一试图与 Objective-C 互操作的项目;其他语言也做到了(成功程度各不相同)
- Swift:从一开始就是为了与 Objective-C 互操作而构建的,并且是
objc2
试图达到功能对等的目标(尽管可能永远无法达到)。真正美丽设计的语言! - C#:Xamarin,Xamarin.Mac,这是“应该”工作的良好灵感来源。
- Python:PyObjC(以前?)官方苹果项目,它使用“BridgeSupport”进行工作,如今他们还通过调用 Clang 生成元数据。其他还包括
objp
和 rubicon.objc - Ruby:MacRuby,RubyCocoa
- Dart:
ffigen
- Kotlin:有内置支持
- Nim:有内置支持,
darwin
,objc
- D:有内置支持,
derelict
- Java:Java-Objective-C-Bridge,Multi-OS Engine: Nat/J(还有一个生成器),苹果还有一个非常古老的官方项目。
- Node.js:NodObjC,
objc
- Zig:zig-objcrt
- D:有内置支持,
derelict
- V:实际上并不存在,他们只是编写和编译 Objective-C 代码,并使用手动 C 绑定。
- Go:MacDriver