diff --git a/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm b/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm index 78a1747604..dd2aa67cd1 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm @@ -23,6 +23,17 @@ ============================================================================== */ +static void juceFreeAccessibilityPlatformSpecificData (UIAccessibilityElement* element) +{ + if (auto* container = juce::getIvar (element, "container")) + { + object_setInstanceVariable (element, "container", nullptr); + object_setInstanceVariable (container, "handler", nullptr); + + [container release]; + } +} + namespace juce { @@ -176,8 +187,6 @@ private: private: AccessibilityElement() { - addMethod (@selector (dealloc), dealloc, "v@:"); - addMethod (@selector (isAccessibilityElement), getIsAccessibilityElement, "c@:"); addMethod (@selector (accessibilityContainer), getAccessibilityContainer, "@@:"); addMethod (@selector (accessibilityFrame), getAccessibilityFrame, @encode (CGRect), "@:"); @@ -221,17 +230,6 @@ private: } //============================================================================== - static void dealloc (id self, SEL) - { - if (UIAccessibilityElement* container = getContainer (self)) - { - [container release]; - object_setInstanceVariable (self, "container", nullptr); - } - - sendSuperclassMessage (self, @selector (dealloc)); - } - static id getAccessibilityContainer (id self, SEL) { if (auto* handler = getHandler (self)) @@ -245,14 +243,16 @@ private: return container; static AccessibilityContainer cls; + id windowHandle = (id) handler->getComponent().getWindowHandle(); UIAccessibilityElement* container = [cls.createInstance() initWithAccessibilityContainer: windowHandle]; - object_setInstanceVariable (container, "handler", handler); + [container retain]; + object_setInstanceVariable (container, "handler", handler); object_setInstanceVariable (self, "container", container); - return (id) getContainer (self); + return container; } if (auto* parent = handler->getParent()) diff --git a/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm b/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm index ead38d2738..174e264eda 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm @@ -23,6 +23,8 @@ ============================================================================== */ +static void juceFreeAccessibilityPlatformSpecificData (NSAccessibilityElement*) {} + namespace juce { diff --git a/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm b/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm index fdae83b8fb..1875a22829 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm +++ b/modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm @@ -27,21 +27,23 @@ namespace juce { //============================================================================== +struct AccessibleObjCClassDeleter +{ + template + void operator() (ElementType* element) const + { + juceFreeAccessibilityPlatformSpecificData (element); + + object_setInstanceVariable (element, "handler", nullptr); + [element release]; + } +}; + template class AccessibleObjCClass : public ObjCClass { -private: - struct Deleter - { - void operator() (Base* element) const - { - object_setInstanceVariable (element, "handler", nullptr); - [element release]; - } - }; - public: - using Holder = std::unique_ptr; + using Holder = std::unique_ptr; protected: AccessibleObjCClass() : ObjCClass ("JUCEAccessibilityElement_")