pub struct DispatchRetained<T: ?Sized> { /* private fields */ }Expand description
A reference counted pointer type for Dispatch objects.
DispatchRetained strongly references or “retains” the given object
T, and decrements the retain count or “releases” it again when dropped,
thereby ensuring it will be deallocated at the right time.
The type T inside DispatchRetained<T> can be anything that implements
DispatchObject, i.e. any Dispatch object.
§Comparison to other types
DispatchRetained<T> is equivalent to objc2::rc::Retained, and can be
converted to/from that when the "objc2" feature is enabled. Note though
that this type uses the underlying Dispatch primitives dispatch_retain /
dispatch_release instead of objc_retain / objc_release for
performance, and to avoid depending on the Objective-C runtime if not
needed.
You can also view DispatchRetained<T> as the Dispatch equivalent of
std::sync::Arc, that is, it is a thread-safe reference-counting smart
pointer that allows cloning by bumping the reference count.
Unlike Arc, objects can be retained directly from a &T using
DispatchObject::retain (for Arc you need &Arc<T>).
Weak references are not supported, for that you need to convert to
objc2::rc::Retained.
§Forwarding implementations
Since DispatchRetained<T> is a smart pointer, it Derefs to T.
It also forwards the implementation of a bunch of standard library traits
such as PartialEq, AsRef, and so on, so that it becomes possible
to use e.g. DispatchRetained<DispatchQueue> as-if it you had a
&DispatchQueue. Note that having a DispatchQueue directly is not
possible since dispatch objects cannot live on the stack, but instead must
reside on the heap, and as such must be accessed behind a pointer or a
reference.
§Memory layout
This is guaranteed to have the same size and alignment as a pointer to the
object, i.e. same as *const T or dispatch_object_t.
Additionally, it participates in the null-pointer optimization, that is,
Option<DispatchRetained<T>> is guaranteed to have the same size as
DispatchRetained<T>.
Implementations§
Source§impl<T: ?Sized + DispatchObject> DispatchRetained<T>
impl<T: ?Sized + DispatchObject> DispatchRetained<T>
Sourcepub unsafe fn from_raw(ptr: NonNull<T>) -> Self
pub unsafe fn from_raw(ptr: NonNull<T>) -> Self
Construct a DispatchRetained from a pointer that already has +1
retain count.
This is useful when you have been given a pointer to an object from some API that returns a retained pointer, and expects you to release it. That is, an API that follows the create rule.
§Safety
The pointer must be a valid and live object according to Dispatch, and
it must be of type T.
Additionally, you must ensure the given object pointer has +1 retain count.
Sourcepub unsafe fn retain(ptr: NonNull<T>) -> Self
pub unsafe fn retain(ptr: NonNull<T>) -> Self
Retain the pointer and construct a DispatchRetained from it.
This is useful when you have been given a pointer to an object from some API that follows the get rule, and you would like to keep it around for longer than the current memory context.
§Safety
The pointer must be a valid and live object according to Dispatch, and
it must be of type T.
Sourcepub fn into_raw(this: Self) -> NonNull<T>
pub fn into_raw(this: Self) -> NonNull<T>
Consumes the DispatchRetained, returning a raw pointer with +1
retain count.
After calling this function, the caller is responsible for the memory
previously managed by the DispatchRetained.
This is effectively the opposite of DispatchRetained::from_raw.
This is an associated method, and must be called as
DispatchRetained::into_raw(obj).
Sourcepub fn as_ptr(this: &Self) -> NonNull<T>
pub fn as_ptr(this: &Self) -> NonNull<T>
Returns a raw pointer to the object.
The pointer is valid for at least as long as the DispatchRetained is
held.
This is an associated method, and must be called as
DispatchRetained::as_ptr(&obj).
Sourcepub unsafe fn cast_unchecked<U: DispatchObject>(
this: Self,
) -> DispatchRetained<U> ⓘ
pub unsafe fn cast_unchecked<U: DispatchObject>( this: Self, ) -> DispatchRetained<U> ⓘ
Unchecked conversion to another Dispatch object.
This is equivalent to a cast between two pointers.
This is an associated method, and must be called as
DispatchRetained::cast_unchecked(obj).
§Safety
You must ensure that the object can be reinterpreted as the given type.
If T is not 'static, you must ensure that U ensures that the
data contained by T is kept alive for as long as U lives.
Additionally, you must ensure that any safety invariants that the new type has are upheld.
Trait Implementations§
Source§impl<T: ?Sized> Borrow<T> for DispatchRetained<T>
impl<T: ?Sized> Borrow<T> for DispatchRetained<T>
Source§impl<T: ?Sized + DispatchObject> Clone for DispatchRetained<T>
impl<T: ?Sized + DispatchObject> Clone for DispatchRetained<T>
Source§fn clone(&self) -> Self
fn clone(&self) -> Self
Retain the object, increasing its reference count.
This calls DispatchObject::retain internally.
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<T: ?Sized> Deref for DispatchRetained<T>
impl<T: ?Sized> Deref for DispatchRetained<T>
Source§impl<T: ?Sized> Drop for DispatchRetained<T>
impl<T: ?Sized> Drop for DispatchRetained<T>
Source§impl<T: ?Sized + Error> Error for DispatchRetained<T>
impl<T: ?Sized + Error> Error for DispatchRetained<T>
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
Source§impl<'a, A, T: ?Sized> Extend<A> for &'a DispatchRetained<T>
impl<'a, A, T: ?Sized> Extend<A> for &'a DispatchRetained<T>
Source§fn extend<I: IntoIterator<Item = A>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = A>>(&mut self, iter: I)
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)Source§impl<A, T: ?Sized> Extend<A> for DispatchRetained<T>
impl<A, T: ?Sized> Extend<A> for DispatchRetained<T>
Source§fn extend<I: IntoIterator<Item = A>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = A>>(&mut self, iter: I)
Source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one)Source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one)Source§impl<T: ?Sized + AsRef<U>, U: DispatchObject> From<&T> for DispatchRetained<U>
impl<T: ?Sized + AsRef<U>, U: DispatchObject> From<&T> for DispatchRetained<U>
Source§impl<T: ?Sized + DispatchObject + Message> From<DispatchRetained<T>> for Retained<T>
impl<T: ?Sized + DispatchObject + Message> From<DispatchRetained<T>> for Retained<T>
Source§fn from(obj: DispatchRetained<T>) -> Self
fn from(obj: DispatchRetained<T>) -> Self
Convert a DispatchRetained into a objc2::rc::Retained.
This conversion is cost-free, since Dispatch objects are fully interoperable with Objective-C retain/release message sending.
Source§impl<T: ?Sized + DispatchObject + Message> From<Retained<T>> for DispatchRetained<T>
impl<T: ?Sized + DispatchObject + Message> From<Retained<T>> for DispatchRetained<T>
Source§fn from(obj: Retained<T>) -> Self
fn from(obj: Retained<T>) -> Self
Convert a objc2::rc::Retained into a DispatchRetained.
This only works if the type is a Dispatch object (implements the
DispatchObject trait).
This conversion is cost-free.
Source§impl<'a, T: ?Sized> Future for &'a DispatchRetained<T>
impl<'a, T: ?Sized> Future for &'a DispatchRetained<T>
Source§impl<'a, T: ?Sized> Hasher for &'a DispatchRetained<T>
impl<'a, T: ?Sized> Hasher for &'a DispatchRetained<T>
Source§fn write_u128(&mut self, i: u128)
fn write_u128(&mut self, i: u128)
u128 into this hasher.Source§fn write_usize(&mut self, i: usize)
fn write_usize(&mut self, i: usize)
usize into this hasher.Source§fn write_i128(&mut self, i: i128)
fn write_i128(&mut self, i: i128)
i128 into this hasher.Source§fn write_isize(&mut self, i: isize)
fn write_isize(&mut self, i: isize)
isize into this hasher.Source§fn write_length_prefix(&mut self, len: usize)
fn write_length_prefix(&mut self, len: usize)
hasher_prefixfree_extras)Source§impl<T: ?Sized> Hasher for DispatchRetained<T>
impl<T: ?Sized> Hasher for DispatchRetained<T>
Source§fn write_u128(&mut self, i: u128)
fn write_u128(&mut self, i: u128)
u128 into this hasher.Source§fn write_usize(&mut self, i: usize)
fn write_usize(&mut self, i: usize)
usize into this hasher.Source§fn write_i128(&mut self, i: i128)
fn write_i128(&mut self, i: i128)
i128 into this hasher.Source§fn write_isize(&mut self, i: isize)
fn write_isize(&mut self, i: isize)
isize into this hasher.Source§fn write_length_prefix(&mut self, len: usize)
fn write_length_prefix(&mut self, len: usize)
hasher_prefixfree_extras)Source§impl<T: Ord + ?Sized> Ord for DispatchRetained<T>
impl<T: Ord + ?Sized> Ord for DispatchRetained<T>
Source§impl<T: ?Sized + PartialEq<U>, U: ?Sized> PartialEq<DispatchRetained<U>> for DispatchRetained<T>
impl<T: ?Sized + PartialEq<U>, U: ?Sized> PartialEq<DispatchRetained<U>> for DispatchRetained<T>
Source§impl<T: ?Sized + PartialOrd<U>, U: ?Sized> PartialOrd<DispatchRetained<U>> for DispatchRetained<T>
impl<T: ?Sized + PartialOrd<U>, U: ?Sized> PartialOrd<DispatchRetained<U>> for DispatchRetained<T>
Source§impl<T: ?Sized> Pointer for DispatchRetained<T>
impl<T: ?Sized> Pointer for DispatchRetained<T>
Source§impl<'a, T: ?Sized> Read for &'a DispatchRetained<T>
impl<'a, T: ?Sized> Read for &'a DispatchRetained<T>
Source§fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
Source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
read, except that it reads into a slice of buffers. Read moreSource§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
buf. Read moreSource§fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
buf. Read moreSource§fn read_exact(&mut self, buf: &mut [u8]) -> Result<()>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<()>
buf. Read moreSource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector)Source§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)Source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)cursor. Read more1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Read. Read moreSource§impl<T: ?Sized> Read for DispatchRetained<T>
impl<T: ?Sized> Read for DispatchRetained<T>
Source§fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
Source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
read, except that it reads into a slice of buffers. Read moreSource§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
buf. Read moreSource§fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
buf. Read moreSource§fn read_exact(&mut self, buf: &mut [u8]) -> Result<()>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<()>
buf. Read moreSource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector)Source§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)Source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
read_buf)cursor. Read more1.0.0 · Source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Read. Read moreSource§impl<'a, T: ?Sized> Seek for &'a DispatchRetained<T>
impl<'a, T: ?Sized> Seek for &'a DispatchRetained<T>
Source§fn seek(&mut self, pos: SeekFrom) -> Result<u64>
fn seek(&mut self, pos: SeekFrom) -> Result<u64>
Source§fn stream_position(&mut self) -> Result<u64>
fn stream_position(&mut self) -> Result<u64>
1.55.0 · Source§fn rewind(&mut self) -> Result<(), Error>
fn rewind(&mut self) -> Result<(), Error>
Source§impl<T: ?Sized> Seek for DispatchRetained<T>
impl<T: ?Sized> Seek for DispatchRetained<T>
Source§fn seek(&mut self, pos: SeekFrom) -> Result<u64>
fn seek(&mut self, pos: SeekFrom) -> Result<u64>
Source§fn stream_position(&mut self) -> Result<u64>
fn stream_position(&mut self) -> Result<u64>
1.55.0 · Source§fn rewind(&mut self) -> Result<(), Error>
fn rewind(&mut self) -> Result<(), Error>
Source§impl<'a, T: ?Sized> Write for &'a DispatchRetained<T>
impl<'a, T: ?Sized> Write for &'a DispatchRetained<T>
Source§impl<'a, T: ?Sized> Write for &'a DispatchRetained<T>
impl<'a, T: ?Sized> Write for &'a DispatchRetained<T>
Source§fn write(&mut self, buf: &[u8]) -> Result<usize>
fn write(&mut self, buf: &[u8]) -> Result<usize>
Source§fn flush(&mut self) -> Result<()>
fn flush(&mut self) -> Result<()>
Source§fn write_all(&mut self, buf: &[u8]) -> Result<()>
fn write_all(&mut self, buf: &[u8]) -> Result<()>
Source§fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<()>
fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<()>
Source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
can_vector)Source§impl<T: ?Sized> Write for DispatchRetained<T>
impl<T: ?Sized> Write for DispatchRetained<T>
Source§fn write(&mut self, buf: &[u8]) -> Result<usize>
fn write(&mut self, buf: &[u8]) -> Result<usize>
Source§fn flush(&mut self) -> Result<()>
fn flush(&mut self) -> Result<()>
Source§fn write_all(&mut self, buf: &[u8]) -> Result<()>
fn write_all(&mut self, buf: &[u8]) -> Result<()>
Source§fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<()>
fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<()>
Source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
can_vector)impl<T: Eq + ?Sized> Eq for DispatchRetained<T>
impl<T: ?Sized + RefUnwindSafe> RefUnwindSafe for DispatchRetained<T>
impl<T: ?Sized + Sync + Send> Send for DispatchRetained<T>
DispatchRetained<T> is Send if T is Send + Sync.
impl<T: ?Sized + Sync + Send> Sync for DispatchRetained<T>
DispatchRetained<T> is Sync if T is Send + Sync.