From 4dc3c056361476585b03ee19c2fe821d1daf99de Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Tue, 31 May 2016 13:18:45 -0700 Subject: [PATCH] FlutterViewController should not retain listeners (#2726) This patch makes the FlutterViewController interface more idiomatic by not retaining listeners. It's the callers responsibility to make sure the lifetimes work out. --- .../Headers/FlutterAsyncMessageListener.h | 2 ++ .../Headers/FlutterMessageListener.h | 2 ++ .../framework/Headers/FlutterViewController.h | 10 ++++--- .../framework/Source/FlutterViewController.mm | 28 +++++++++++++------ .../Source/application_messages_impl.h | 11 +++----- .../Source/application_messages_impl.mm | 14 +++++++--- 6 files changed, 44 insertions(+), 23 deletions(-) diff --git a/sky/shell/platform/ios/framework/Headers/FlutterAsyncMessageListener.h b/sky/shell/platform/ios/framework/Headers/FlutterAsyncMessageListener.h index 1d947a036..dd3cc1466 100644 --- a/sky/shell/platform/ios/framework/Headers/FlutterAsyncMessageListener.h +++ b/sky/shell/platform/ios/framework/Headers/FlutterAsyncMessageListener.h @@ -15,6 +15,8 @@ FLUTTER_EXPORT - (void)didReceiveString:(NSString*)message callback:(void(^)(NSString*))sendResponse; +@property(readonly, strong, nonatomic) NSString* messageName; + @end #endif // FLUTTER_FLUTTERASYNCMESSAGELISTENER_H_ diff --git a/sky/shell/platform/ios/framework/Headers/FlutterMessageListener.h b/sky/shell/platform/ios/framework/Headers/FlutterMessageListener.h index 945045038..bbf344f22 100644 --- a/sky/shell/platform/ios/framework/Headers/FlutterMessageListener.h +++ b/sky/shell/platform/ios/framework/Headers/FlutterMessageListener.h @@ -14,6 +14,8 @@ FLUTTER_EXPORT - (NSString*)didReceiveString:(NSString*)message; +@property(readonly, strong, nonatomic) NSString* messageName; + @end #endif // FLUTTER_FLUTTERMESSAGELISTENER_H_ diff --git a/sky/shell/platform/ios/framework/Headers/FlutterViewController.h b/sky/shell/platform/ios/framework/Headers/FlutterViewController.h index 09c24e3a2..c92f0d70f 100644 --- a/sky/shell/platform/ios/framework/Headers/FlutterViewController.h +++ b/sky/shell/platform/ios/framework/Headers/FlutterViewController.h @@ -28,11 +28,13 @@ FLUTTER_EXPORT withMessageName:(NSString*)messageName callback:(void(^)(NSString*))callback; -- (void)setMessageListener:(NSObject*)listener - forMessagesWithName:(NSString*)messageName; +- (void)addMessageListener:(NSObject*)listener; -- (void)setAsyncMessageListener:(NSObject*)listener - forMessagesWithName:(NSString*)messageName; +- (void)removeMessageListener:(NSObject*)listener; + +- (void)addAsyncMessageListener:(NSObject*)listener; + +- (void)removeAsyncMessageListener:(NSObject*)listener; @end diff --git a/sky/shell/platform/ios/framework/Source/FlutterViewController.mm b/sky/shell/platform/ios/framework/Source/FlutterViewController.mm index 81fccefd4..ee1bd99d5 100644 --- a/sky/shell/platform/ios/framework/Source/FlutterViewController.mm +++ b/sky/shell/platform/ios/framework/Source/FlutterViewController.mm @@ -483,20 +483,32 @@ static inline PointerTypeMapperPhase PointerTypePhaseFromUITouchPhase( }); } -- (void)setMessageListener:(NSObject*)listener - forMessagesWithName:(NSString*)messageName { +- (void)addMessageListener:(NSObject*)listener { NSAssert(listener, @"The listener must not be null"); + NSString* messageName = listener.messageName; NSAssert(messageName, @"The messageName must not be null"); - _appMessageReceiver.SetMessageListener(messageName.UTF8String, - base::scoped_nsprotocol*>(listener)); + _appMessageReceiver.SetMessageListener(messageName.UTF8String, listener); } -- (void)setAsyncMessageListener:(NSObject*)listener - forMessagesWithName:(NSString*)messageName { +- (void)removeMessageListener:(NSObject*)listener { NSAssert(listener, @"The listener must not be null"); + NSString* messageName = listener.messageName; NSAssert(messageName, @"The messageName must not be null"); - _appMessageReceiver.SetAsyncMessageListener(messageName.UTF8String, - base::scoped_nsprotocol*>(listener)); + _appMessageReceiver.SetMessageListener(messageName.UTF8String, nil); +} + +- (void)addAsyncMessageListener:(NSObject*)listener { + NSAssert(listener, @"The listener must not be null"); + NSString* messageName = listener.messageName; + NSAssert(messageName, @"The messageName must not be null"); + _appMessageReceiver.SetAsyncMessageListener(messageName.UTF8String, listener); +} + +- (void)removeAsyncMessageListener:(NSObject*)listener { + NSAssert(listener, @"The listener must not be null"); + NSString* messageName = listener.messageName; + NSAssert(messageName, @"The messageName must not be null"); + _appMessageReceiver.SetAsyncMessageListener(messageName.UTF8String, nil); } @end diff --git a/sky/shell/platform/ios/framework/Source/application_messages_impl.h b/sky/shell/platform/ios/framework/Source/application_messages_impl.h index 54f4f9290..c30329db1 100644 --- a/sky/shell/platform/ios/framework/Source/application_messages_impl.h +++ b/sky/shell/platform/ios/framework/Source/application_messages_impl.h @@ -8,7 +8,6 @@ #include #include "base/memory/weak_ptr.h" -#include "base/mac/scoped_nsobject.h" #include "mojo/common/binding_set.h" #include "sky/services/platform/app_messages.mojom.h" #include "sky/shell/platform/ios/framework/Headers/FlutterAsyncMessageListener.h" @@ -27,11 +26,11 @@ class ApplicationMessagesImpl : public flutter::platform::ApplicationMessages { void SetMessageListener( const std::string& message_name, - base::scoped_nsprotocol*> listener); + NSObject* listener); void SetAsyncMessageListener( const std::string& message_name, - base::scoped_nsprotocol*> listener); + NSObject* listener); private: void SendString(const mojo::String& message_name, @@ -40,11 +39,9 @@ class ApplicationMessagesImpl : public flutter::platform::ApplicationMessages { mojo::BindingSet binding_; std::unordered_map< - std::string, - base::scoped_nsprotocol*>> listeners_; + std::string, NSObject*> listeners_; std::unordered_map< - std::string, - base::scoped_nsprotocol*>> async_listeners_; + std::string, NSObject*> async_listeners_; base::WeakPtrFactory weak_factory_; }; diff --git a/sky/shell/platform/ios/framework/Source/application_messages_impl.mm b/sky/shell/platform/ios/framework/Source/application_messages_impl.mm index fae177736..066f232b7 100644 --- a/sky/shell/platform/ios/framework/Source/application_messages_impl.mm +++ b/sky/shell/platform/ios/framework/Source/application_messages_impl.mm @@ -26,14 +26,20 @@ void ApplicationMessagesImpl::AddBinding( void ApplicationMessagesImpl::SetMessageListener( const std::string& message_name, - base::scoped_nsprotocol*> listener) { - listeners_[message_name] = listener; + NSObject* listener) { + if (listener) + listeners_[message_name] = listener; + else + listeners_.erase(message_name); } void ApplicationMessagesImpl::SetAsyncMessageListener( const std::string& message_name, - base::scoped_nsprotocol*> listener) { - async_listeners_[message_name] = listener; + NSObject* listener) { + if (listener) + async_listeners_[message_name] = listener; + else + async_listeners_.erase(message_name); } void ApplicationMessagesImpl::SendString( -- GitLab