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

objc2-calendar-store

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

1个不稳定版本

使用旧的Rust 2015

0.0.0 2024年5月10日

#7 in #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块的绑定,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 方法标记为安全)可能最简单。

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

例如,您可以从将 objc 替换为 objc2 在您的 Cargo.toml 中开始。

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

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

许可证

本项目受MIT许可证的许可,请参阅LICENSE.txt

正在进行使其也受Apache许可证(版本2.0)的双重许可的工作,请参阅此处

致谢/先前的艺术

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

这些几乎全部由@SSheldon创建,所以非常感谢他们在这些crates上的出色工作!

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

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

无运行时依赖