#[repr(C)]pub struct AnyObject(/* private fields */);
Expand description
An Objective-C object.
This is slightly different from NSObject
in that it may represent an
instance of an arbitary Objective-C class (e.g. it does not have to be
a subclass of NSObject
, so it can represent other root classes like
NSProxy
).
Id<AnyObject>
is equivalent to Objective-C’s id _Nonnull
.
This contains UnsafeCell
, and is similar to that in that one can
safely access and perform interior mutability on this (both via.
msg_send!
and through ivars), so long as Rust’s mutability rules are
upheld, and that data races are avoided.
Note: This is intentionally neither Sync
, Send
, UnwindSafe
,
RefUnwindSafe
nor Unpin
, since that is something that may change
depending on the specific subclass. For example, NSAutoreleasePool
is
not Send
, it has to be deallocated on the same thread that it was
created. NSLock
is not Send
either.
This is somewhat similar to ffi::objc_object
.
Implementations§
source§impl AnyObject
impl AnyObject
sourcepub fn class(&self) -> &'static AnyClass
pub fn class(&self) -> &'static AnyClass
Dynamically find the class of this object.
§Example
Check that an instance of NSObject
has the precise class NSObject
.
use objc2::ClassType;
use objc2::runtime::NSObject;
let obj = NSObject::new();
assert_eq!(obj.class(), NSObject::class());
sourcepub unsafe fn set_class<'s>(this: &Self, cls: &AnyClass) -> &'s AnyClass
pub unsafe fn set_class<'s>(this: &Self, cls: &AnyClass) -> &'s AnyClass
Change the class of the object at runtime.
Returns the object’s previous class.
§Safety
The new class must:
-
Be a subclass of the object’s current class.
-
The subclass must not add any instance variables - importantly, the instance size of old and the new classes must be the same.
-
Any overridden methods on the new class must be fully compatible with the old ones.
Note that in the general case, where arbitary parts of the program may be trying to modify the class of the object concurrently, these requirements are not actually possible to uphold.
Since usage of this function is expected to be extremely rare, and even more so trying to do it concurrently, it is recommended that you verify that the returned class is what you would expect, and if not, panic.
sourcepub unsafe fn get_ivar<T: Encode>(&self, name: &str) -> &T
👎Deprecated: this is difficult to use correctly, use Ivar::load
instead.
pub unsafe fn get_ivar<T: Encode>(&self, name: &str) -> &T
Ivar::load
instead.Use Ivar::load
instead.
§Safety
The object must have an instance variable with the given name, and it
must be of type T
.
See Ivar::load_ptr
for details surrounding this.
sourcepub unsafe fn get_mut_ivar<T: Encode>(&mut self, name: &str) -> &mut T
👎Deprecated: this is difficult to use correctly, use Ivar::load_mut
instead.
pub unsafe fn get_mut_ivar<T: Encode>(&mut self, name: &str) -> &mut T
Ivar::load_mut
instead.Use Ivar::load_mut
instead.
§Safety
The object must have an instance variable with the given name, and it
must be of type T
.
See Ivar::load_ptr
for details surrounding this.