Objective-C Runtime bindings and wrapper for Rust.
- Documentation: http://ssheldon.github.io/rust-objc/objc/
- Crate: https://crates.io/crates/objc
Messaging objects
Objective-C objects can be messaged using the msg_send!
macro:
let cls = get.unwrap;
let obj: *mut Object = msg_send!;
let hash: usize = msg_send!;
let is_kind: BOOL = msg_send!;
// Even void methods must have their return type annotated
let _: = msg_send!;
Reference counting
Objective-C objects are reference counted; to ensure that they are retained and
released at the proper times, we can use the Id
struct.
To enforce aliasing rules, an Id
can be either owned or shared; if it is
owned, meaning the Id
is the only reference to the object, it can be mutably
dereferenced. An owned Id
can be downgraded to a ShareId
which can be cloned to allow multiple references.
Weak references may be created using the WeakId
struct.
let cls = get.unwrap;
let obj: = unsafe ;
// obj will be released when it goes out of scope
// share the object so we can clone it
let obj = obj.share;
let another_ref = obj.clone;
// dropping our other reference will decrement the retain count
drop;
let weak = new;
assert!;
// After the object is deallocated, our weak pointer returns none
drop;
assert!;
Declaring classes
Classes can be declared using the ClassDecl
struct. Instance variables and
methods can then be added before the class is ultimately registered.
The following example demonstrates declaring a class named MyNumber
that has
one ivar, a u32
named _number
and a number
method that returns it:
let superclass = get.unwrap;
let mut decl = new.unwrap;
// Add an instance variable
decl.;
// Add an ObjC method for getting the number
extern
unsafe
decl.register;