objc2 0.3.0-beta.3.patch-leaks

Objective-C interface and bindings to the Cocoa Foundation framework
Documentation
use objc2::foundation::NSObject;
use objc2::runtime::Class;
use objc2::{sel, ClassType, Encode};

fn main() {
    // Get the class representing `NSObject`
    let cls = NSObject::class();

    // Inspect various properties of the class
    println!("NSObject superclass: {:?}", cls.superclass());
    println!("NSObject size: {}", cls.instance_size());
    println!(
        "-[NSObject alloc] would work: {}",
        cls.responds_to(sel!(alloc))
    );
    println!(
        "+[NSObject alloc] would work: {}",
        cls.metaclass().responds_to(sel!(alloc))
    );

    // Inspect an instance variable on the class
    //
    // Note: You should not rely on the `isa` ivar being available,
    // this is only for demonstration.
    let ivar = cls
        .instance_variable("isa")
        .expect("No ivar with name 'isa' found on NSObject");
    println!(
        "Instance variable {} has type encoding {:?}",
        ivar.name(),
        ivar.type_encoding()
    );
    assert!(<*const Class>::ENCODING.equivalent_to_str(ivar.type_encoding()));

    // Inspect a method of the class
    let method = cls.instance_method(sel!(hash)).unwrap();
    println!(
        "-[NSObject hash] takes {} parameters",
        method.arguments_count()
    );
    #[cfg(feature = "malloc")]
    {
        let hash_return = method.return_type();
        println!("-[NSObject hash] return type: {:?}", hash_return);
        assert!(usize::ENCODING.equivalent_to_str(&hash_return));
    }

    // Create an instance
    let obj = NSObject::new();

    println!("NSObject address: {:p}", obj);

    // Access an ivar of the object
    //
    // As before, you should not rely on the `isa` ivar being available!
    let isa = unsafe { *obj.ivar::<*const Class>("isa") };
    println!("NSObject isa: {:?}", isa);
}