53 lines
1.6 KiB
Rust
53 lines
1.6 KiB
Rust
use objc2::runtime::{AnyClass, NSObject};
|
|
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 AnyClass>::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()
|
|
);
|
|
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: {obj:p}");
|
|
|
|
// Read an ivar on the object
|
|
let isa: *const AnyClass = unsafe { *ivar.load(&obj) };
|
|
println!("NSObject isa: {isa:?}");
|
|
}
|