Struct SCNRenderer

Source
#[repr(C)]
pub struct SCNRenderer { /* private fields */ }
Available on crate feature SCNRenderer only.
Expand description

SCNRenderer lets you use the SceneKit renderer in an OpenGL context or Metal render pass descriptor of your own.

See also Apple’s documentation

Implementations§

Source§

impl SCNRenderer

Source

pub unsafe fn rendererWithDevice_options( device: Option<&ProtocolObject<dyn MTLDevice>>, options: Option<&NSDictionary>, ) -> Retained<Self>

Available on crate feature objc2-metal and non-watchOS only.

Creates a new renderer object that renders using Metal.

Parameter device: The metal device to use. Pass nil to let SceneKit choose a default device.

Parameter options: An optional dictionary for future extensions.

Source

pub unsafe fn scene(&self) -> Option<Retained<SCNScene>>

Available on crate feature SCNScene only.

Specifies the scene of the receiver

Source

pub unsafe fn setScene(&self, scene: Option<&SCNScene>)

Available on crate feature SCNScene only.

Setter for scene.

Source

pub unsafe fn renderAtTime_viewport_commandBuffer_passDescriptor( &self, time: CFTimeInterval, viewport: CGRect, command_buffer: &ProtocolObject<dyn MTLCommandBuffer>, render_pass_descriptor: &MTLRenderPassDescriptor, )

Available on crate feature objc2-core-foundation and crate feature objc2-metal and non-watchOS only.

updates and renders the receiver’s scene at the specified time (system time) viewport, Metal command buffer and pass descriptor.

Use this method to render using Metal.

Source

pub unsafe fn renderAtTime(&self, time: CFTimeInterval)

Available on crate feature objc2-core-foundation only.

updates and renders the receiver’s scene at the specified time (system time).

This method only work if the receiver was allocated with an OpenGL context. Use renderAtTime:withEncoder:pass:commandQueue: to render with Metal.

Source

pub unsafe fn updateAtTime(&self, time: CFTimeInterval)

Available on crate feature objc2-core-foundation only.

updates the receiver’s scene at the specified time (system time).

Source

pub unsafe fn renderWithViewport_commandBuffer_passDescriptor( &self, viewport: CGRect, command_buffer: &ProtocolObject<dyn MTLCommandBuffer>, render_pass_descriptor: &MTLRenderPassDescriptor, )

Available on crate feature objc2-core-foundation and crate feature objc2-metal and non-watchOS only.

renders the receiver’s scene with the specified viewport, Metal command buffer and pass descriptor.

Use this method to render using Metal. This method doesn’t update the scene’s animations, physics, particles etc… It’s up to you to call “updateAtTime:” to update the scene.

Source

pub unsafe fn nextFrameTime(&self) -> CFTimeInterval

Available on crate feature objc2-core-foundation only.

Returns the time at which the next update should happen. If infinite no update needs to be scheduled yet. If the current frame time, a continuous animation is running and an update should be scheduled after a “natural” delay.

Source

pub unsafe fn snapshotAtTime_withSize_antialiasingMode( &self, time: CFTimeInterval, size: CGSize, antialiasing_mode: SCNAntialiasingMode, ) -> Retained<NSImage>

Available on crate feature SCNSceneRenderer and crate feature objc2-app-kit and crate feature objc2-core-foundation and macOS only.

renders the receiver’s scene at the specified time (system time) into an image.

Source

pub unsafe fn updateProbes_atTime( &self, light_probes: &NSArray<SCNNode>, time: CFTimeInterval, )

Available on crate features SCNNode and objc2-core-foundation only.

Update the specified probes by computing their incoming irradiance in the receiver’s scene at the specified time.

Parameter lightProbes: An array of nodes that must have a light probe attached.

Parameter time: The time used to render the scene when computing the light probes irradiance.

Light probes are only supported with Metal. This method is observable using NSProgress.

Source§

impl SCNRenderer

Methods declared on superclass NSObject.

Source

pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>

Source

pub unsafe fn new() -> Retained<Self>

Source§

impl SCNRenderer

SCNDeprecated.

Source

pub unsafe fn render(&self)

👎Deprecated
Available on crate feature SceneKitDeprecated only.

renders the receiver’s scene at the current system time.

This method only work if the receiver was allocated with an OpenGL context and it is deprecated (use renderAtTime: instead). Use renderAtTime:withEncoder:pass:commandQueue: to render with Metal.

Methods from Deref<Target = NSObject>§

Source

pub fn doesNotRecognizeSelector(&self, sel: Sel) -> !

Handle messages the object doesn’t recognize.

See Apple’s documentation for details.

Methods from Deref<Target = AnyObject>§

Source

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());
Source

pub unsafe fn get_ivar<T>(&self, name: &str) -> &T
where T: Encode,

👎Deprecated: this is difficult to use correctly, use 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.

Source

pub fn downcast_ref<T>(&self) -> Option<&T>
where T: DowncastTarget,

Attempt to downcast the object to a class of type T.

This is the reference-variant. Use Retained::downcast if you want to convert a retained object to another type.

§Mutable classes

Some classes have immutable and mutable variants, such as NSString and NSMutableString.

When some Objective-C API signature says it gives you an immutable class, it generally expects you to not mutate that, even though it may technically be mutable “under the hood”.

So using this method to convert a NSString to a NSMutableString, while not unsound, is generally frowned upon unless you created the string yourself, or the API explicitly documents the string to be mutable.

See Apple’s documentation on mutability and on isKindOfClass: for more details.

§Generic classes

Objective-C generics are called “lightweight generics”, and that’s because they aren’t exposed in the runtime. This makes it impossible to safely downcast to generic collections, so this is disallowed by this method.

You can, however, safely downcast to generic collections where all the type-parameters are AnyObject.

§Panics

This works internally by calling isKindOfClass:. That means that the object must have the instance method of that name, and an exception will be thrown (if CoreFoundation is linked) or the process will abort if that is not the case. In the vast majority of cases, you don’t need to worry about this, since both root objects NSObject and NSProxy implement this method.

§Examples

Cast an NSString back and forth from NSObject.

use objc2::rc::Retained;
use objc2_foundation::{NSObject, NSString};

let obj: Retained<NSObject> = NSString::new().into_super();
let string = obj.downcast_ref::<NSString>().unwrap();
// Or with `downcast`, if we do not need the object afterwards
let string = obj.downcast::<NSString>().unwrap();

Try (and fail) to cast an NSObject to an NSString.

use objc2_foundation::{NSObject, NSString};

let obj = NSObject::new();
assert!(obj.downcast_ref::<NSString>().is_none());

Try to cast to an array of strings.

use objc2_foundation::{NSArray, NSObject, NSString};

let arr = NSArray::from_retained_slice(&[NSObject::new()]);
// This is invalid and doesn't type check.
let arr = arr.downcast_ref::<NSArray<NSString>>();

This fails to compile, since it would require enumerating over the array to ensure that each element is of the desired type, which is a performance pitfall.

Downcast when processing each element instead.

use objc2_foundation::{NSArray, NSObject, NSString};

let arr = NSArray::from_retained_slice(&[NSObject::new()]);

for elem in arr {
    if let Some(data) = elem.downcast_ref::<NSString>() {
        // handle `data`
    }
}

Trait Implementations§

Source§

impl AsRef<AnyObject> for SCNRenderer

Source§

fn as_ref(&self) -> &AnyObject

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl AsRef<NSObject> for SCNRenderer

Source§

fn as_ref(&self) -> &NSObject

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl AsRef<SCNRenderer> for SCNRenderer

Source§

fn as_ref(&self) -> &Self

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Borrow<AnyObject> for SCNRenderer

Source§

fn borrow(&self) -> &AnyObject

Immutably borrows from an owned value. Read more
Source§

impl Borrow<NSObject> for SCNRenderer

Source§

fn borrow(&self) -> &NSObject

Immutably borrows from an owned value. Read more
Source§

impl ClassType for SCNRenderer

Source§

const NAME: &'static str = "SCNRenderer"

The name of the Objective-C class that this type represents. Read more
Source§

type Super = NSObject

The superclass of this class. Read more
Source§

type ThreadKind = <<SCNRenderer as ClassType>::Super as ClassType>::ThreadKind

Whether the type can be used from any thread, or from only the main thread. Read more
Source§

fn class() -> &'static AnyClass

Get a reference to the Objective-C class that this type represents. Read more
Source§

fn as_super(&self) -> &Self::Super

Get an immutable reference to the superclass.
Source§

impl Debug for SCNRenderer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Deref for SCNRenderer

Source§

type Target = NSObject

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl Hash for SCNRenderer

Source§

fn hash<H: Hasher>(&self, state: &mut H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Message for SCNRenderer

Source§

fn retain(&self) -> Retained<Self>
where Self: Sized,

Increment the reference count of the receiver. Read more
Source§

impl NSObjectProtocol for SCNRenderer

Source§

fn isEqual(&self, other: Option<&AnyObject>) -> bool
where Self: Sized + Message,

Check whether the object is equal to an arbitrary other object. Read more
Source§

fn hash(&self) -> usize
where Self: Sized + Message,

An integer that can be used as a table address in a hash table structure. Read more
Source§

fn isKindOfClass(&self, cls: &AnyClass) -> bool
where Self: Sized + Message,

Check if the object is an instance of the class, or one of its subclasses. Read more
Source§

fn is_kind_of<T>(&self) -> bool
where T: ClassType, Self: Sized + Message,

👎Deprecated: use isKindOfClass directly, or cast your objects with AnyObject::downcast_ref
Check if the object is an instance of the class type, or one of its subclasses. Read more
Source§

fn isMemberOfClass(&self, cls: &AnyClass) -> bool
where Self: Sized + Message,

Check if the object is an instance of a specific class, without checking subclasses. Read more
Source§

fn respondsToSelector(&self, aSelector: Sel) -> bool
where Self: Sized + Message,

Check whether the object implements or inherits a method with the given selector. Read more
Source§

fn conformsToProtocol(&self, aProtocol: &AnyProtocol) -> bool
where Self: Sized + Message,

Check whether the object conforms to a given protocol. Read more
Source§

fn description(&self) -> Retained<NSObject>
where Self: Sized + Message,

A textual representation of the object. Read more
Source§

fn debugDescription(&self) -> Retained<NSObject>
where Self: Sized + Message,

A textual representation of the object to use when debugging. Read more
Source§

fn isProxy(&self) -> bool
where Self: Sized + Message,

Check whether the receiver is a subclass of the NSProxy root class instead of the usual NSObject. Read more
Source§

fn retainCount(&self) -> usize
where Self: Sized + Message,

The reference count of the object. Read more
Source§

impl PartialEq for SCNRenderer

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl RefEncode for SCNRenderer

Source§

const ENCODING_REF: Encoding = <NSObject as ::objc2::RefEncode>::ENCODING_REF

The Objective-C type-encoding for a reference of this type. Read more
Source§

impl SCNSceneRenderer for SCNRenderer

Available on crate feature SCNSceneRenderer only.
Source§

unsafe fn scene(&self) -> Option<Retained<SCNScene>>
where Self: Sized + Message,

Available on crate feature SCNScene only.
Specifies the scene of the receiver.
Source§

unsafe fn setScene(&self, scene: Option<&SCNScene>)
where Self: Sized + Message,

Available on crate feature SCNScene only.
Setter for scene.
Source§

unsafe fn sceneTime(&self) -> NSTimeInterval
where Self: Sized + Message,

Specifies the current “scene time” to display the scene. Read more
Source§

unsafe fn setSceneTime(&self, scene_time: NSTimeInterval)
where Self: Sized + Message,

Setter for sceneTime.
Source§

unsafe fn delegate( &self, ) -> Option<Retained<ProtocolObject<dyn SCNSceneRendererDelegate>>>
where Self: Sized + Message,

Specifies the renderer delegate.
Source§

unsafe fn setDelegate( &self, delegate: Option<&ProtocolObject<dyn SCNSceneRendererDelegate>>, )
where Self: Sized + Message,

This is a weak property. Setter for delegate.
Source§

unsafe fn hitTest_options( &self, point: CGPoint, options: Option<&NSDictionary<SCNHitTestOption, AnyObject>>, ) -> Retained<NSArray<SCNHitTestResult>>
where Self: Sized + Message,

Available on crate features SCNHitTest and objc2-core-foundation only.
Returns an array of SCNHitTestResult for each node that contains a specified point. Read more
Source§

unsafe fn isNodeInsideFrustum_withPointOfView( &self, node: &SCNNode, point_of_view: &SCNNode, ) -> bool
where Self: Sized + Message,

Available on crate feature SCNNode only.
Test whether node is visible from the specified point of view. Read more
Source§

unsafe fn nodesInsideFrustumWithPointOfView( &self, point_of_view: &SCNNode, ) -> Retained<NSArray<SCNNode>>
where Self: Sized + Message,

Available on crate feature SCNNode only.
Returns an array containing the nodes visible from the specified point of view. Read more
Source§

unsafe fn projectPoint(&self, point: SCNVector3) -> SCNVector3
where Self: Sized + Message,

Available on crate features SceneKitTypes and objc2-core-foundation only.
Projects a point in the world coordinate system using the receiver’s current point of view and viewport. Read more
Source§

unsafe fn unprojectPoint(&self, point: SCNVector3) -> SCNVector3
where Self: Sized + Message,

Available on crate features SceneKitTypes and objc2-core-foundation only.
Unprojects a screenspace 2D point with depth info using the receiver’s current point of view and viewport. Read more
Source§

unsafe fn isPlaying(&self) -> bool
where Self: Sized + Message,

Returns YES if the scene is playing, NO otherwise.
Source§

unsafe fn setPlaying(&self, playing: bool)
where Self: Sized + Message,

Setter for isPlaying.
Source§

unsafe fn loops(&self) -> bool
where Self: Sized + Message,

Indicates whether the receiver restarts playback when it reaches the end of its content. Default: YES. Read more
Source§

unsafe fn setLoops(&self, loops: bool)
where Self: Sized + Message,

Setter for loops.
Source§

unsafe fn pointOfView(&self) -> Option<Retained<SCNNode>>
where Self: Sized + Message,

Available on crate feature SCNNode only.
Specifies the point of view used to render the scene. Read more
Source§

unsafe fn setPointOfView(&self, point_of_view: Option<&SCNNode>)
where Self: Sized + Message,

Available on crate feature SCNNode only.
Setter for pointOfView.
Source§

unsafe fn autoenablesDefaultLighting(&self) -> bool
where Self: Sized + Message,

Specifies whether the receiver should automatically light up scenes that have no light source. The default is NO. Read more
Source§

unsafe fn setAutoenablesDefaultLighting( &self, autoenables_default_lighting: bool, )
where Self: Sized + Message,

Source§

unsafe fn isJitteringEnabled(&self) -> bool
where Self: Sized + Message,

Specifies whether the receiver should jitter the rendered scene to reduce aliasing artifacts. Read more
Source§

unsafe fn setJitteringEnabled(&self, jittering_enabled: bool)
where Self: Sized + Message,

Setter for isJitteringEnabled.
Source§

unsafe fn isTemporalAntialiasingEnabled(&self) -> bool
where Self: Sized + Message,

Specifies whether the receiver should reduce aliasing artifacts in real time based on temporal coherency. Defaults to NO.
Source§

unsafe fn setTemporalAntialiasingEnabled( &self, temporal_antialiasing_enabled: bool, )
where Self: Sized + Message,

Source§

unsafe fn prepareObject_shouldAbortBlock( &self, object: &AnyObject, block: Option<&Block<dyn Fn() -> Bool + '_>>, ) -> bool
where Self: Sized + Message,

Available on crate feature block2 only.
Prepare the specified object for drawing. Read more
Source§

unsafe fn prepareObjects_withCompletionHandler( &self, objects: &NSArray, completion_handler: Option<&Block<dyn Fn(Bool)>>, )
where Self: Sized + Message,

Available on crate feature block2 only.
Prepare the specified objects for drawing on the background. Read more
Source§

unsafe fn showsStatistics(&self) -> bool
where Self: Sized + Message,

Determines whether the receiver should display statistics info like FPS. Defaults to NO. Read more
Source§

unsafe fn setShowsStatistics(&self, shows_statistics: bool)
where Self: Sized + Message,

Setter for showsStatistics.
Source§

unsafe fn debugOptions(&self) -> SCNDebugOptions
where Self: Sized + Message,

Specifies the debug options of the receiver. Defaults to SCNDebugOptionNone.
Source§

unsafe fn setDebugOptions(&self, debug_options: SCNDebugOptions)
where Self: Sized + Message,

Setter for debugOptions.
Source§

unsafe fn renderingAPI(&self) -> SCNRenderingAPI
where Self: Sized + Message,

Specifies the rendering API associated to the receiver. Read more
Source§

unsafe fn workingColorSpace(&self) -> Retained<CGColorSpace>
where Self: Sized + Message,

Available on crate feature objc2-core-graphics only.
Specifies the color space used by the receiver for shading. Read more
Source§

unsafe fn context(&self) -> *mut c_void
where Self: Sized + Message,

A Core OpenGL render context that is used as the render target (a CGLContextObj on macOS, an EAGLContext on iOS).
Source§

unsafe fn currentRenderCommandEncoder( &self, ) -> Option<Retained<ProtocolObject<dyn MTLRenderCommandEncoder>>>
where Self: Sized + Message,

Available on crate feature objc2-metal and non-watchOS only.
The current render command encoder if any. This property is only valid within the SCNSceneRendererDelegate methods and when rendering with Metal. Otherwise it is set to nil.
Source§

unsafe fn currentRenderPassDescriptor( &self, ) -> Retained<MTLRenderPassDescriptor>
where Self: Sized + Message,

Available on crate feature objc2-metal and non-watchOS only.
The render pass descriptor of the receiver. This property is only valid within the SCNSceneRendererDelegate methods and when rendering with Metal. Otherwise it is set to nil.
Source§

unsafe fn device(&self) -> Option<Retained<ProtocolObject<dyn MTLDevice>>>
where Self: Sized + Message,

Available on crate feature objc2-metal and non-watchOS only.
The metal device of the renderer. This property is only valid on a renderer created with a Metal device. Otherwise it is set to nil.
Source§

unsafe fn colorPixelFormat(&self) -> MTLPixelFormat
where Self: Sized + Message,

Available on crate feature objc2-metal and non-watchOS only.
The pixel format of the color attachment 0 of the renderer. This property is only valid on a renderer created with a Metal device.
Source§

unsafe fn depthPixelFormat(&self) -> MTLPixelFormat
where Self: Sized + Message,

Available on crate feature objc2-metal and non-watchOS only.
The pixel format of the depth attachment of the renderer. This property is only valid on a renderer created with a Metal device.
Source§

unsafe fn stencilPixelFormat(&self) -> MTLPixelFormat
where Self: Sized + Message,

Available on crate feature objc2-metal and non-watchOS only.
The pixel format of the stencil attachment of the renderer. This property is only valid on a renderer created with a Metal device.
Source§

unsafe fn commandQueue( &self, ) -> Option<Retained<ProtocolObject<dyn MTLCommandQueue>>>
where Self: Sized + Message,

Available on crate feature objc2-metal and non-watchOS only.
The command queue of the renderer. This property is only valid on a renderer created with a Metal device. Otherwise it is set to nil.
Source§

unsafe fn audioEngine(&self) -> Retained<AVAudioEngine>
where Self: Sized + Message,

Available on crate feature objc2-avf-audio only.
Contains the instance of audio engine used by the scene. Read more
Source§

unsafe fn audioEnvironmentNode(&self) -> Retained<AVAudioEnvironmentNode>
where Self: Sized + Message,

Available on crate feature objc2-avf-audio only.
Contains the instance of audio environment node used by the scene to spacialize sounds.
Source§

unsafe fn audioListener(&self) -> Option<Retained<SCNNode>>
where Self: Sized + Message,

Available on crate feature SCNNode only.
Use this property to set the audio node to use as the listener position and orientation when rendering positional audio for this scene. The default is nil which means that the current point of view will be used dynamically.
Source§

unsafe fn setAudioListener(&self, audio_listener: Option<&SCNNode>)
where Self: Sized + Message,

Available on crate feature SCNNode only.
Setter for audioListener.
Source§

unsafe fn currentViewport(&self) -> CGRect
where Self: Sized + Message,

Available on crate feature objc2-core-foundation only.
Returns the current viewport for this renderer, can be used to get the actual viewport from within the delegate callback during a live resize.
Source§

unsafe fn currentTime(&self) -> NSTimeInterval
where Self: Sized + Message,

👎Deprecated
Specifies the current time to display the scene. Read more
Source§

unsafe fn setCurrentTime(&self, current_time: NSTimeInterval)
where Self: Sized + Message,

👎Deprecated
Setter for currentTime.
Source§

unsafe fn usesReverseZ(&self) -> bool
where Self: Sized + Message,

Specifies if the renderer should use the reverse Z technique. Defaults to YES. Read more
Source§

unsafe fn setUsesReverseZ(&self, uses_reverse_z: bool)
where Self: Sized + Message,

Setter for usesReverseZ.
Source§

impl SCNTechniqueSupport for SCNRenderer

Available on crate feature SCNTechnique only.
Source§

unsafe fn technique(&self) -> Option<Retained<SCNTechnique>>
where Self: Sized + Message,

Specifies the technique of the receiver. Defaults to nil.
Source§

unsafe fn setTechnique(&self, technique: Option<&SCNTechnique>)
where Self: Sized + Message,

Setter for technique.
Source§

impl DowncastTarget for SCNRenderer

Source§

impl Eq for SCNRenderer

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<'a, T> AllocAnyThread for T
where T: ClassType<ThreadKind = dyn AllocAnyThread + 'a> + ?Sized,

Source§

fn alloc() -> Allocated<Self>
where Self: Sized + ClassType,

Allocate a new instance of the class. Read more
Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> AutoreleaseSafe for T
where T: ?Sized,