24 个版本

使用旧的 Rust 2015

0.2.7 2019 年 10 月 18 日
0.2.6 2019 年 3 月 25 日
0.2.5 2018 年 7 月 24 日
0.2.2 2016 年 10 月 30 日
0.0.1 2014 年 11 月 23 日

#5 in macOS 和 iOS API

Download history 121528/week @ 2024-04-20 95458/week @ 2024-04-27 87317/week @ 2024-05-04 93965/week @ 2024-05-11 96284/week @ 2024-05-18 89031/week @ 2024-05-25 88089/week @ 2024-06-01 99945/week @ 2024-06-08 103694/week @ 2024-06-15 102218/week @ 2024-06-22 99637/week @ 2024-06-29 97962/week @ 2024-07-06 103882/week @ 2024-07-13 103007/week @ 2024-07-20 102384/week @ 2024-07-27 99041/week @ 2024-08-03

423,126 每月下载量
4,039 个 crate(207 个直接使用) 中使用

MIT 许可证

83KB
2K SLoC

Objective-C 运行时绑定和包装器,适用于 Rust。

消息对象

可以使用 msg_send! 宏向 Objective-C 对象发送消息

let cls = class!(NSObject);
let obj: *mut Object = msg_send![cls, new];
let hash: usize = msg_send![obj, hash];
let is_kind: BOOL = msg_send![obj, isKindOfClass:cls];
// Even void methods must have their return type annotated
let _: () = msg_send![obj, release];

引用计数

rc 模块提供的实用程序为在 Rust 中与 Objective-C 的引用计数对象一起使用提供了类似 ARC 的语义。一个 StrongPtr 保留一个对象,并在丢弃时释放对象。一个 WeakPtr 不会保留对象,但可以被升级为 StrongPtr,如果对象已被释放,则安全失败。

// StrongPtr will release the object when dropped
let obj = unsafe {
    StrongPtr::new(msg_send![class!(NSObject), new])
};

// Cloning retains the object an additional time
let cloned = obj.clone();
autoreleasepool(|| {
    // Autorelease consumes the StrongPtr, but won't
    // actually release until the end of an autoreleasepool
    cloned.autorelease();
});

// Weak references won't retain the object
let weak = obj.weak();
drop(obj);
assert!(weak.load().is_null());

声明类

可以使用 ClassDecl 结构声明类。在类最终注册之前,可以添加实例变量和方法。

以下示例演示了如何声明一个名为 MyNumber 的类,它有一个名为 _numberu32 ivar,并有一个返回它的 number 方法

let superclass = class!(NSObject);
let mut decl = ClassDecl::new("MyNumber", superclass).unwrap();

// Add an instance variable
decl.add_ivar::<u32>("_number");

// Add an ObjC method for getting the number
extern fn my_number_get(this: &Object, _cmd: Sel) -> u32 {
    unsafe { *this.get_ivar("_number") }
}
unsafe {
    decl.add_method(sel!(number),
        my_number_get as extern fn(&Object, Sel) -> u32);
}

decl.register();

异常

默认情况下,如果 msg_send! 宏导致抛出异常,这将导致 Rust 回退,并导致不安全、未定义的行为。然而,这个 crate 有一个 "exception" 功能,当启用时,将每个 msg_send! 包装在 @try/@catch 中,并在捕获异常时引发恐慌,防止 Objective-C 回退到 Rust。

消息类型验证

Objective-C运行时包括每个方法的编码,用于描述参数和返回类型。这个crate可以利用这些编码来验证Rust中使用的类型是否与方法编码的类型匹配。

要使用此功能,请启用"verify_message"特性。启用此特性后,会对每次消息发送执行类型检查,这还要求所有消息的所有参数和返回值都实现Encode

如果这项要求过于繁重,或者您只想验证特定的消息,可以调用特定选择器的Message::verify_message方法。

其他操作系统支持

可以使用GNUstep Objective-C运行时在Linux或*BSD上使用这些绑定。GNUstep Objective-C运行时

依赖关系