book/src/objc.md
bindgen does not (yet) have full Objective-C support, but it can generate
bindings for many of the Apple frameworks without too much blocklisting.
In order to generate bindings, you will need -x objective-c as a clang arg. If
you'd like to use block you will need
-fblocks as a clang arg as well.
Depending on your setup, you may need --generate-block to generate the block
function aliases and --block-extern-crate to insert a extern crate block at
the beginning of the generated bindings. The same logic applies to the
--objc-extern-crate parameter.
The Objective-C classes will be represented as a struct Foo(id) and a trait
IFoo where Foo is the Objective-C class and id is an alias for *mut objc::runtime::Object (the pointer to the Objective-C instance). The trait
IFoo is needed to allow for the generated inheritance.
Functions that use or return Objective-C pointers of instance Foo will return
Foo. The reason this works is because Foo represented as transparent.
This will be helpful for many Objective-C frameworks. However, there are some
cases where functions return instancetype which is a type alias for id so
an occasional foo.0 may be required. An example of this would in the UIKit
framework should you want to add a UILabel to a
UIStackView
you will need to convert the UILabel to a UIView via UIView(label.0).
Each class (struct) has an alloc and a dealloc to match that of some of the alloc
methods found in NSObject.
In order to initialize a class Foo, you will have to do something like let foo = Foo(Foo::alloc().initWithStuff()).
To blocklist an Objective-C method, you should add the bindgen generated method
path (e.g. IFoo::method or IFoo::class_method) as a blocklist item.
I which
stands for interface.P which
stands for Protocol.struct Foo(id) where Foo is the class
name and id is a pointer to the Objective-C Object.aarch64-apple-ios, you'll need to have the clang arg
--target=arm64-apple-ios as mentioned
here.time.h as has a variable called timezone that
conflicts with some of the things in NSCalendar.h.Self for you given class, it
returns a mut * objc::runtime::Objc which is aliased as id. This is because
Objective-C's inheritance doesn't perfectly match that of Rust's.bindgen against, you may end up including
all of Core Foundation and any other frameworks. This will result in a very
long compile time.Options.