Version: Unity 6.7 Beta (6000.7)
LanguageEnglish
  • C#

OnComponentRemovedAttribute

class in UnityEngine.UIElements

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Description

Declares a static method of a VisualElementComponentAttribute struct that runs when VisualElement.RemoveComponent removes the component from an element.


The method must be @@static void M(ref T self, VisualElement owner), and a component may declare at most one. It runs before the component storage is freed and before its [RegisterCallback]@@ handlers are unregistered, so the method can still read its own live data and clean up any owner state the component configured.

It runs only on an explicit VisualElement.RemoveComponent or VisualElement.TryRemoveComponent call, immediately and inline, while the element is still alive. Does not run when the element is released, when its panel is torn down, or when it is garbage-collected. It is therefore not guaranteed to run for a given component instance.

Because the method receives the owning element, it may read its own state, touch that element, and add or remove components.

To free something the component allocated, use [ReleaseComponentResources] instead. That hook is guaranteed to run exactly once per component instance, on every release path: explicit removal, VisualElement.ReleaseResources, panel teardown, a recursive clear with VisualElementClearOptions.RecursiveReleaseResources, and garbage collection. Its call is deferred to the next Collect() on the main thread, where the element may already have been collected, so it receives only its own data and no element, and may do nothing beyond freeing what the component allocated.

Rule of thumb: if you allocated it, free it in [ReleaseComponentResources]. If you want to react to a user removing your component, use [OnComponentRemoved]. Never rely on [OnComponentRemoved] to release anything.