summaryrefslogtreecommitdiffstats
path: root/third_party/rust/objc/examples/example.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/objc/examples/example.rs')
-rw-r--r--third_party/rust/objc/examples/example.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/third_party/rust/objc/examples/example.rs b/third_party/rust/objc/examples/example.rs
new file mode 100644
index 0000000000..5346b620fb
--- /dev/null
+++ b/third_party/rust/objc/examples/example.rs
@@ -0,0 +1,45 @@
+#[macro_use]
+extern crate objc;
+
+use objc::Encode;
+use objc::rc::StrongPtr;
+use objc::runtime::{Class, Object};
+
+fn main() {
+ // Get a class
+ let cls = class!(NSObject);
+ println!("NSObject size: {}", cls.instance_size());
+
+ // Inspect its ivars
+ println!("NSObject ivars:");
+ for ivar in cls.instance_variables().iter() {
+ println!("{}", ivar.name());
+ }
+
+ // Allocate an instance
+ let obj = unsafe {
+ let obj: *mut Object = msg_send![cls, alloc];
+ let obj: *mut Object = msg_send![obj, init];
+ StrongPtr::new(obj)
+ };
+ println!("NSObject address: {:p}", obj);
+
+ // Access an ivar of the object
+ let isa: *const Class = unsafe {
+ *(**obj).get_ivar("isa")
+ };
+ println!("NSObject isa: {:?}", isa);
+
+ // Inspect a method of the class
+ let hash_sel = sel!(hash);
+ let hash_method = cls.instance_method(hash_sel).unwrap();
+ let hash_return = hash_method.return_type();
+ println!("-[NSObject hash] return type: {:?}", hash_return);
+ assert!(hash_return == usize::encode());
+
+ // Invoke a method on the object
+ let hash: usize = unsafe {
+ msg_send![*obj, hash]
+ };
+ println!("NSObject hash: {}", hash);
+}