diff --git a/modules/juce_core/native/juce_osx_ObjCHelpers.h b/modules/juce_core/native/juce_osx_ObjCHelpers.h index 91a46cf104..f173534226 100644 --- a/modules/juce_core/native/juce_osx_ObjCHelpers.h +++ b/modules/juce_core/native/juce_osx_ObjCHelpers.h @@ -54,6 +54,16 @@ namespace } } +//============================================================================== +template +struct NSObjectRetainer +{ + inline NSObjectRetainer (ObjectType* o) : object (o) { [object retain]; } + inline ~NSObjectRetainer() { [object release]; } + + ObjectType* object; +}; + //============================================================================== template struct ObjCClass diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index f33e68f8c5..881d5de909 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -676,11 +676,9 @@ public: return used; } - else - { - if (handleKeyUpOrDown (false)) - return true; - } + + if (handleKeyUpOrDown (false)) + return true; } return false; @@ -688,6 +686,10 @@ public: bool redirectKeyDown (NSEvent* ev) { + // (need to retain this in case a modal loop runs in handleKeyEvent and + // our event object gets lost) + const NSObjectRetainer r (ev); + updateKeysDown (ev, true); bool used = handleKeyEvent (ev, true); @@ -715,6 +717,9 @@ public: void redirectModKeyChange (NSEvent* ev) { + // (need to retain this in case a modal loop runs and our event object gets lost) + const NSObjectRetainer r (ev); + keysCurrentlyDown.clear(); handleKeyUpOrDown (true); diff --git a/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm b/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm index a317671cac..2b39f6ae94 100644 --- a/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm +++ b/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm @@ -26,13 +26,13 @@ class UIViewComponent::Pimpl : public ComponentMovementWatcher { public: - Pimpl (UIView* const view_, Component& owner_) - : ComponentMovementWatcher (&owner_), - view (view_), - owner (owner_), + Pimpl (UIView* const v, Component& comp) + : ComponentMovementWatcher (&comp), + view (v), + owner (comp), currentPeer (nullptr) { - [view_ retain]; + [view retain]; if (owner.isShowing()) componentPeerChanged();