diff --git a/sdk/objc/components/network/RTCNetworkMonitor+Private.h b/sdk/objc/components/network/RTCNetworkMonitor+Private.h index 89866ea359..b5c786be18 100644 --- a/sdk/objc/components/network/RTCNetworkMonitor+Private.h +++ b/sdk/objc/components/network/RTCNetworkMonitor+Private.h @@ -20,4 +20,7 @@ - (instancetype)initWithObserver:(webrtc::NetworkMonitorObserver *)observer NS_DESIGNATED_INITIALIZER; +/** Stops the receiver from posting updates to `observer`. */ +- (void)stop; + @end diff --git a/sdk/objc/components/network/RTCNetworkMonitor.mm b/sdk/objc/components/network/RTCNetworkMonitor.mm index 8ac7d3a0d2..7ac4946ec3 100644 --- a/sdk/objc/components/network/RTCNetworkMonitor.mm +++ b/sdk/objc/components/network/RTCNetworkMonitor.mm @@ -88,7 +88,12 @@ rtc::AdapterType AdapterTypeFromInterfaceType(nw_interface_type_t interfaceType) rtc::AdapterType adapterType = AdapterTypeFromInterfaceType(interfaceType); map->insert(std::pair(name, adapterType)); }); - strongSelf->_observer->OnPathUpdate(std::move(*map)); + @synchronized(strongSelf) { + webrtc::NetworkMonitorObserver *observer = strongSelf->_observer; + if (observer) { + observer->OnPathUpdate(std::move(*map)); + } + } delete map; }); nw_path_monitor_set_queue( @@ -100,10 +105,20 @@ rtc::AdapterType AdapterTypeFromInterfaceType(nw_interface_type_t interfaceType) return self; } -- (void)dealloc { +- (void)cancel { if (@available(iOS 12, *)) { nw_path_monitor_cancel(_pathMonitor); } } +- (void)stop { + [self cancel]; + @synchronized(self) { + _observer = nil; + } +} + +- (void)dealloc { + [self cancel]; +} @end diff --git a/sdk/objc/native/src/objc_network_monitor.mm b/sdk/objc/native/src/objc_network_monitor.mm index 2fc84dfa51..14ed73374c 100644 --- a/sdk/objc/native/src/objc_network_monitor.mm +++ b/sdk/objc/native/src/objc_network_monitor.mm @@ -27,6 +27,7 @@ ObjCNetworkMonitor::ObjCNetworkMonitor() { } ObjCNetworkMonitor::~ObjCNetworkMonitor() { + [network_monitor_ stop]; network_monitor_ = nil; } @@ -50,6 +51,7 @@ void ObjCNetworkMonitor::Stop() { return; } safety_flag_->SetNotAlive(); + [network_monitor_ stop]; network_monitor_ = nil; started_ = false; }