1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
use std::fmt;
use std::mem;
use std::ops::Deref;
use runtime::{Object, self};
use super::WeakPtr;
/// A pointer that strongly references an object, ensuring it won't be deallocated.
pub struct StrongPtr(*mut Object);
impl StrongPtr {
/// Constructs a `StrongPtr` to a newly created object that already has a
/// +1 retain count. This will not retain the object.
/// When dropped, the object will be released.
/// Unsafe because the caller must ensure the given object pointer is valid.
pub unsafe fn new(ptr: *mut Object) -> Self {
StrongPtr(ptr)
}
/// Retains the given object and constructs a `StrongPtr` to it.
/// When dropped, the object will be released.
/// Unsafe because the caller must ensure the given object pointer is valid.
pub unsafe fn retain(ptr: *mut Object) -> Self {
StrongPtr(runtime::objc_retain(ptr))
}
/// Autoreleases self, meaning that the object is not immediately released,
/// but will be when the autorelease pool is drained. A pointer to the
/// object is returned, but its validity is no longer ensured.
pub fn autorelease(self) -> *mut Object {
let ptr = self.0;
mem::forget(self);
unsafe {
runtime::objc_autorelease(ptr);
}
ptr
}
/// Returns a `WeakPtr` to self.
pub fn weak(&self) -> WeakPtr {
unsafe { WeakPtr::new(self.0) }
}
}
impl Drop for StrongPtr {
fn drop(&mut self) {
unsafe {
runtime::objc_release(self.0);
}
}
}
impl Clone for StrongPtr {
fn clone(&self) -> StrongPtr {
unsafe {
StrongPtr::retain(self.0)
}
}
}
impl Deref for StrongPtr {
type Target = *mut Object;
fn deref(&self) -> &*mut Object {
&self.0
}
}
impl fmt::Pointer for StrongPtr {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Pointer::fmt(&self.0, f)
}
}