use objc2::foundation::NSObject;
use objc2::runtime::Class;
use objc2::{sel, ClassType, Encode};
fn main() {
let cls = NSObject::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))
);
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()));
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));
}
let obj = NSObject::new();
println!("NSObject address: {:p}", obj);
let isa = unsafe { *obj.ivar::<*const Class>("isa") };
println!("NSObject isa: {:?}", isa);
}