Crate block [] [src]

A Rust interface for Objective-C blocks.

For more information on the specifics of the block implementation, see Clang's documentation:

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 {, 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 {, 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.



An Objective-C block that takes arguments of A when called and returns a value of R.


An Objective-C block whose size is known at compile time and may be constructed on the stack.


A reference-counted Objective-C block.



Types that may be used as the arguments to an Objective-C block.


Types that may be converted into a ConcreteBlock.