9 releases

Uses old Rust 2015

0.1.6 May 8, 2016
0.1.5 Apr 4, 2016
0.1.4 Nov 12, 2015
0.1.2 Oct 10, 2015
0.0.1 Apr 17, 2015

#138 in macOS and iOS APIs

Download history 228185/week @ 2025-12-10 196376/week @ 2025-12-17 121490/week @ 2025-12-24 151630/week @ 2025-12-31 259812/week @ 2026-01-07 253235/week @ 2026-01-14 278063/week @ 2026-01-21 272558/week @ 2026-01-28 308423/week @ 2026-02-04 289617/week @ 2026-02-11 297466/week @ 2026-02-18 523365/week @ 2026-02-25 351451/week @ 2026-03-04 354748/week @ 2026-03-11 347722/week @ 2026-03-18 353289/week @ 2026-03-25

1,520,544 downloads per month
Used in 4,990 crates (66 directly)

MIT license

16KB
290 lines

Rust interface for Apple's C language extension of blocks.

For more information on the specifics of the block implementation, see Clang's documentation: http://clang.llvm.org/docs/Block-ABI-Apple.html

Invoking blocks

The Block struct is used for invoking blocks from Objective-C. For example, consider this Objective-C function:

int32_t sum(int32_t (^block)(int32_t, int32_t)) {
    return block(5, 8);
}

We could write it in Rust as the following:

unsafe fn sum(block: &Block<(i32, i32), i32>) -> i32 {
    block.call((5, 8))
}

Note the extra parentheses in the call method, since the arguments must be passed as a tuple.

Creating blocks

Creating a block to pass to Objective-C can be done with the ConcreteBlock struct. For example, to create a block that adds two i32s, we could write:

let block = ConcreteBlock::new(|a: i32, b: i32| a + b);
let block = block.copy();
assert!(unsafe { block.call((5, 8)) } == 13);

It is important to copy your block to the heap (with the copy method) before passing it to Objective-C; this is because our ConcreteBlock is only meant to be copied once, and we can enforce this in Rust, but if Objective-C code were to copy it twice we could have a double free.

No runtime deps