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
423,126 每月下载量
在 4,039 个 crate(207 个直接使用) 中使用
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
的类,它有一个名为 _number
的 u32
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运行时。