diff --git a/ios/Classes/Boost/FlutterBoostPlugin.h b/ios/Classes/Boost/FlutterBoostPlugin.h index 04000dec2efd5b7f749402c147329339f0c7793f..2e3e38bdc50e81813deeda3e347a4a60b4d9074b 100755 --- a/ios/Classes/Boost/FlutterBoostPlugin.h +++ b/ios/Classes/Boost/FlutterBoostPlugin.h @@ -125,5 +125,12 @@ NS_ASSUME_NONNULL_BEGIN exts:(NSDictionary *)exts onPageFinished:(void (^)(NSDictionary *))resultCallback completion:(void (^)(BOOL))completion; + +//切记:在destroyPluginContextå‰åŠ¡å¿…将所有FlutterViewControlleråŠå…¶å类的实例销æ¯ã€‚在这里是FLBFlutterViewContainer。å¦åˆ™ä¼šå¼‚常;以下是全部æ¥éª¤ +//1. 首先通过为所有FlutterPluginçš„methodChannel属性设为nilæ¥è§£é™¤å…¶ä¸ŽFlutterEngine的间接强引用 +//2. 销æ¯æ‰€æœ‰çš„FlutterViewController实例(或ä¿è¯æ‰€æœ‰FlutterVCå·²ç»é€€å‡ºï¼‰ï¼Œæ¥è§£é™¤å…¶ä¸ŽFlutterEngine的强引用,在æ¯ä¸ªVCå¸è½½çš„时候FlutterEngine会调用destroyContext +//3. 调用FlutterBoostPlugin.destroyPluginContext函数æ¥è§£é™¤ä¸Žå…¶å†…部context的强引用。内部æŒæœ‰çš„FlutterEngine也会被å¸è½½ï¼ˆéžå¤–éƒ¨ä¼ å…¥çš„æƒ…å½¢ï¼‰ +//4. å¦‚æžœæ˜¯å¤–éƒ¨ä¼ å…¥çš„FlutterEngine,需è¦å¤–部自己释放 +- (void)destroyPluginContext; @end NS_ASSUME_NONNULL_END diff --git a/ios/Classes/Boost/FlutterBoostPlugin.m b/ios/Classes/Boost/FlutterBoostPlugin.m index 0d33ec06ec3ee121cacc0827184b1d2369e3a85a..623c1de1356b920cde54bba83d7f3ce8323779ae 100755 --- a/ios/Classes/Boost/FlutterBoostPlugin.m +++ b/ios/Classes/Boost/FlutterBoostPlugin.m @@ -130,8 +130,8 @@ __weak __typeof__(self) weakSelf = self; dispatch_once(&onceToken, ^{ __strong __typeof__(weakSelf) self = weakSelf; - self.factory = FLBFactory.new; - self.application = [self->_factory createApplication:platform]; + FLBFactory *factory = FLBFactory.new; + self.application = [factory createApplication:platform]; [self.application startFlutterWithPlatform:platform withEngine:engine onStart:callback]; @@ -182,4 +182,9 @@ id<FLBFlutterApplicationInterface> app = [[FlutterBoostPlugin sharedInstance] application]; [app close:uniqueId result:resultData exts:exts completion:completion]; } + +- (void)destroyPluginContext{ + self.methodChannel = nil; + self.application = nil; +} @end diff --git a/ios/Classes/Boost/FlutterBoostPlugin_private.h b/ios/Classes/Boost/FlutterBoostPlugin_private.h index db9068e7d940bd1b362d81e6b6b0b5e3875f8cd1..f0dcd913f33b886519619a2d1579c3fa8b7e3678 100644 --- a/ios/Classes/Boost/FlutterBoostPlugin_private.h +++ b/ios/Classes/Boost/FlutterBoostPlugin_private.h @@ -28,7 +28,6 @@ #import "FlutterBoostPlugin.h" @interface FlutterBoostPlugin() @property (nonatomic,strong) id<FLBFlutterApplicationInterface> application; -@property (nonatomic,strong) id<FLBAbstractFactory> factory; @property (nonatomic,strong) FlutterMethodChannel *methodChannel; @property (nonatomic,copy) NSString *fPageId; @property (nonatomic,copy) NSString *fPagename; diff --git a/ios/Classes/Engine/FLBFlutterEngine.m b/ios/Classes/Engine/FLBFlutterEngine.m index 5a90e33343c3841e64cf6b279473876ead8fde17..7e5678c496db3e95eb8ace406ac9f34070c9d686 100755 --- a/ios/Classes/Engine/FLBFlutterEngine.m +++ b/ios/Classes/Engine/FLBFlutterEngine.m @@ -105,11 +105,6 @@ arguments:@{@"type":@"foreground"}]; } -- (FlutterEngine *)engine -{ - return _engine; -} - - (void)atacheToViewController:(FlutterViewController *)vc { if(_engine.viewController != vc){ @@ -132,5 +127,8 @@ // [self detach]; } +- (void)dealloc{ + [self.engine setViewController:nil]; +} @end