9 个版本
使用旧的 Rust 2015
0.1.6 | 2016 年 5 月 8 日 |
---|---|
0.1.5 | 2016 年 4 月 4 日 |
0.1.4 | 2015 年 11 月 12 日 |
0.1.2 | 2015 年 10 月 10 日 |
0.0.1 | 2015 年 4 月 17 日 |
#36 in macOS 和 iOS API
339,025 每月下载量
用于 3,495 个 (55 个直接) 包
16KB
290 行
Rust 对 Apple 的 C 语言扩展块接口。
有关块实现的详细信息,请参阅 Clang 的文档:https://clang.llvm.net.cn/docs/Block-ABI-Apple.html
调用块
使用 Block
结构从 Objective-C 调用块。例如,考虑以下 Objective-C 函数
int32_t sum(int32_t (^block)(int32_t, int32_t)) {
return block(5, 8);
}
我们可以将其写成如下 Rust 代码
unsafe fn sum(block: &Block<(i32, i32), i32>) -> i32 {
block.call((5, 8))
}
请注意在 call
方法中多出的括号,因为必须将参数作为元组传递。
创建块
可以使用 ConcreteBlock
结构创建传递给 Objective-C 的块。例如,要创建一个将两个 i32
相加的块,我们可以写
let block = ConcreteBlock::new(|a: i32, b: i32| a + b);
let block = block.copy();
assert!(unsafe { block.call((5, 8)) } == 13);
在将块传递给 Objective-C 之前,重要的事情是使用 copy
方法将块复制到堆上;这是因为我们的 ConcreteBlock
只能复制一次,我们可以在 Rust 中强制执行此操作,但如果 Objective-C 代码复制两次,则可能会出现双重释放。