From ce8809e73b05ea28573209cba321ddc54a8bc2f8 Mon Sep 17 00:00:00 2001 From: mengyanluo Date: Thu, 25 Mar 2021 10:40:00 +0800 Subject: [PATCH] fix(ios): improve stability --- ios/sdk/base/executors/HippyJSCExecutor.mm | 22 ++-------------------- ios/sdk/module/loader/ios_loader.cc | 7 ++++++- ios/sdk/module/loader/ios_loader.h | 8 ++++---- 3 files changed, 12 insertions(+), 25 deletions(-) diff --git a/ios/sdk/base/executors/HippyJSCExecutor.mm b/ios/sdk/base/executors/HippyJSCExecutor.mm index 05afef85b..2f12dd7af 100644 --- a/ios/sdk/base/executors/HippyJSCExecutor.mm +++ b/ios/sdk/base/executors/HippyJSCExecutor.mm @@ -76,15 +76,6 @@ struct RandomAccessBundleData { : bundle(nullptr, fclose) { } }; -static NSHashTable *weakBridgeHashTable() { - static dispatch_once_t onceToken; - static NSHashTable *weakBridgeHashTable = nil; - dispatch_once(&onceToken, ^{ - weakBridgeHashTable = [NSHashTable weakObjectsHashTable]; - }); - return weakBridgeHashTable; -} - static bool defaultDynamicLoadAction(const std::string& uri, std::function cb) { NSString *URIString = [NSString stringWithUTF8String:uri.c_str()]; NSURL *url = HippyURLWithString(URIString, NULL); @@ -101,16 +92,8 @@ static bool defaultDynamicLoadAction(const std::string& uri, std::function cb, void *userData) { - HippyBridge *strongBridge = nil; - for (HippyBridge *bridge in weakBridgeHashTable()) { - void *bridgePointer = (__bridge void *)bridge; - if (bridgePointer == userData) { - strongBridge = bridge; - break; - } - } - +static bool loadFunc(const std::string& uri, std::function cb, CFTypeRef userData) { + HippyBridge *strongBridge = (__bridge_transfer HippyBridge *)userData; if ([strongBridge.delegate respondsToSelector:@selector(dynamicLoad:URI:completion:)]) { NSString *URIString = [NSString stringWithUTF8String:uri.c_str()]; BOOL delegateCallRet = [strongBridge.delegate dynamicLoad:strongBridge URI:URIString completion:^(NSString *retString) { @@ -165,7 +148,6 @@ HIPPY_EXPORT_MODULE() } - (void)initURILoader { - [weakBridgeHashTable() addObject:_bridge]; std::shared_ptr loader = std::make_shared(loadFunc, (__bridge void *)_bridge); self.pScope->SetUriLoader(loader); } diff --git a/ios/sdk/module/loader/ios_loader.cc b/ios/sdk/module/loader/ios_loader.cc index ce2c59764..c1790208a 100644 --- a/ios/sdk/module/loader/ios_loader.cc +++ b/ios/sdk/module/loader/ios_loader.cc @@ -25,7 +25,12 @@ #include "core/core.h" -IOSLoader::IOSLoader(RequestUntrustedContentPtr loader, void *userData): loader_(loader), userData_(userData) {} +IOSLoader::IOSLoader(RequestUntrustedContentPtr loader, CFTypeRef userData): loader_(loader), userData_(CFRetain(userData)) {} + +IOSLoader::~IOSLoader() { + CFRelease(userData_); + userData_ = nullptr; +} bool IOSLoader::RequestUntrustedContent(const std::string& uri, std::function cb) { return loader_(uri, cb, userData_); diff --git a/ios/sdk/module/loader/ios_loader.h b/ios/sdk/module/loader/ios_loader.h index 8f644f46b..92fd48c37 100644 --- a/ios/sdk/module/loader/ios_loader.h +++ b/ios/sdk/module/loader/ios_loader.h @@ -24,13 +24,13 @@ #include "core/core.h" -typedef bool (*RequestUntrustedContentPtr)(const std::string& uri, std::function cb, void *userData); +typedef bool (*RequestUntrustedContentPtr)(const std::string& uri, std::function cb, CFTypeRef userData); class IOSLoader : public hippy::base::UriLoader { public: - IOSLoader(RequestUntrustedContentPtr loader, void *userData); + IOSLoader(RequestUntrustedContentPtr loader, CFTypeRef userData); - virtual ~IOSLoader() {} + virtual ~IOSLoader(); virtual bool RequestUntrustedContent(const std::string& uri, std::function cb); @@ -40,5 +40,5 @@ class IOSLoader : public hippy::base::UriLoader { private: RequestUntrustedContentPtr loader_; - void *userData_; + CFTypeRef userData_; };