Feature/zpf (#564)

* iOS: fix memory leak of blur effect

* js: fix callback cause memory leak
This commit is contained in:
osborn 2022-12-20 15:06:46 +08:00 committed by GitHub
parent c60754c53d
commit be4fb05f91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 77 additions and 22 deletions

View File

@ -73,14 +73,22 @@ class CounterView extends ViewHolder {
class CounterVM extends ViewModel<CountModel, CounterView> { class CounterVM extends ViewModel<CountModel, CounterView> {
onAttached(s: CountModel, vh: CounterView) { onAttached(s: CountModel, vh: CounterView) {
vh.counter.onClick = () => { vh.counter.onClick = () => {
Promise.resolve(this.getState().count).then(count => { setInterval(() => {
Promise.resolve().then(() => { // this.updateState(state => {
this.updateState((state) => { // state.count++
state.count = count + 1; // })
}); this.context.callNative("demo", "test2", "sdfsf")
}) //loge("setInterval")
}) }, 1)
}; };
vh.number.onClick = () => {
setInterval(() => {
// this.updateState(state => {
// state.count++
// })
this.context.callNative("demo", "test")
}, 1)
}
} }
onBind(s: CountModel, vh: CounterView) { onBind(s: CountModel, vh: CounterView) {
vh.number.text = `${s.count}`; vh.number.text = `${s.count}`;

View File

@ -11,8 +11,11 @@ @interface DoricDemoPlugin : DoricNativePlugin
@implementation DoricDemoPlugin @implementation DoricDemoPlugin
- (void)test { - (void)test {
}
- (void)test2:(NSString *)val withPromise:(DoricPromise *)promise {
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
ShowToast(@"Test called", DoricGravityCenter); [promise resolve:nil];
}); });
} }
@end @end

View File

@ -46,10 +46,7 @@ - (void)viewDidLoad {
[Doric registerLibrary:[DemoLibrary new]]; [Doric registerLibrary:[DemoLibrary new]];
[Doric enablePerformance:YES]; [Doric enablePerformance:YES];
[Doric enableRenderSnapshot:YES]; [Doric enableRenderSnapshot:YES];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self.view addSubview:[[UITableView new] also:^(UITableView *it) { [self.view addSubview:[[UITableView new] also:^(UITableView *it) {
it.width = self.view.width; it.width = self.view.width;
it.height = self.view.height; it.height = self.view.height;
@ -59,6 +56,10 @@ - (void)viewDidAppear:(BOOL)animated {
}]]; }]];
} }
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.demoFilePaths.count; return self.demoFilePaths.count;
} }

View File

@ -29,10 +29,12 @@ @interface DoricBlurEffectView : UIVisualEffectView
@implementation DoricBlurEffectView @implementation DoricBlurEffectView
- (instancetype)initWithEffect:(UIVisualEffect *)effect { - (instancetype)initWithEffect:(UIVisualEffect *)effect {
if (self = [super initWithEffect:effect]) { if (self = [super initWithEffect:effect]) {
__weak typeof(self) weakSelf = self;
_animator = [[UIViewPropertyAnimator alloc] _animator = [[UIViewPropertyAnimator alloc]
initWithDuration:1 initWithDuration:1
curve:UIViewAnimationCurveLinear curve:UIViewAnimationCurveLinear
animations:^{ animations:^{
__strong typeof(weakSelf) self = weakSelf;
self.effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; self.effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
}]; }];
_animator.fractionComplete = MIN(1, MAX(0, 15.0f / 200)); _animator.fractionComplete = MIN(1, MAX(0, 15.0f / 200));
@ -52,9 +54,6 @@ - (void)setRadius:(NSUInteger)radius {
self.animator.fractionComplete = MIN(1, MAX(0, (radius / 200.f))); self.animator.fractionComplete = MIN(1, MAX(0, (radius / 200.f)));
} }
- (void)dealloc {
[self.animator stopAnimation:YES];
}
@end @end
@interface DoricBlurEffectViewNode () @interface DoricBlurEffectViewNode ()
@ -90,4 +89,8 @@ - (void)blendView:(UIView *)view forPropName:(NSString *)name propValue:(id)prop
[super blendView:view forPropName:name propValue:prop]; [super blendView:view forPropName:name propValue:prop];
} }
} }
- (void)dealloc {
[self.visualEffectView.animator stopAnimation:YES];
};
@end @end

View File

@ -17203,6 +17203,7 @@ var doric = (function (exports) {
} }
hookBeforeNativeCall(context); hookBeforeNativeCall(context);
Reflect.apply(callback.resolve, context, argumentsList); Reflect.apply(callback.resolve, context, argumentsList);
context.callbacks.delete(callbackId);
} }
function jsCallReject(contextId, callbackId, args) { function jsCallReject(contextId, callbackId, args) {
var arguments$1 = arguments; var arguments$1 = arguments;
@ -17223,6 +17224,7 @@ var doric = (function (exports) {
} }
hookBeforeNativeCall(context); hookBeforeNativeCall(context);
Reflect.apply(callback.reject, context.entity, argumentsList); Reflect.apply(callback.reject, context.entity, argumentsList);
context.callbacks.delete(callbackId);
} }
var Context = /** @class */ (function () { var Context = /** @class */ (function () {
function Context(id) { function Context(id) {

View File

@ -1247,6 +1247,9 @@ var doric = (function (exports) {
} }
hookBeforeNativeCall(context); hookBeforeNativeCall(context);
Reflect.apply(callback.resolve, context, argumentsList); Reflect.apply(callback.resolve, context, argumentsList);
if (callback.retained !== true) {
context.callbacks.delete(callbackId);
}
} }
function jsCallReject(contextId, callbackId, args) { function jsCallReject(contextId, callbackId, args) {
const context = gContexts.get(contextId); const context = gContexts.get(contextId);
@ -1265,6 +1268,9 @@ var doric = (function (exports) {
} }
hookBeforeNativeCall(context); hookBeforeNativeCall(context);
Reflect.apply(callback.reject, context.entity, argumentsList); Reflect.apply(callback.reject, context.entity, argumentsList);
if (callback.retained !== true) {
context.callbacks.delete(callbackId);
}
} }
class Context { class Context {
constructor(id) { constructor(id) {
@ -1328,7 +1334,8 @@ var doric = (function (exports) {
const functionId = uniqueId('function'); const functionId = uniqueId('function');
this.callbacks.set(functionId, { this.callbacks.set(functionId, {
resolve: func, resolve: func,
reject: () => { loge("This should not be called"); } reject: () => { loge("This should not be called"); },
retained: true,
}); });
return functionId; return functionId;
} }

View File

@ -1258,6 +1258,9 @@ function jsCallResolve(contextId, callbackId, args) {
} }
hookBeforeNativeCall(context); hookBeforeNativeCall(context);
Reflect.apply(callback.resolve, context, argumentsList); Reflect.apply(callback.resolve, context, argumentsList);
if (callback.retained !== true) {
context.callbacks.delete(callbackId);
}
} }
function jsCallReject(contextId, callbackId, args) { function jsCallReject(contextId, callbackId, args) {
const context = gContexts.get(contextId); const context = gContexts.get(contextId);
@ -1276,6 +1279,9 @@ function jsCallReject(contextId, callbackId, args) {
} }
hookBeforeNativeCall(context); hookBeforeNativeCall(context);
Reflect.apply(callback.reject, context.entity, argumentsList); Reflect.apply(callback.reject, context.entity, argumentsList);
if (callback.retained !== true) {
context.callbacks.delete(callbackId);
}
} }
class Context { class Context {
constructor(id) { constructor(id) {
@ -1339,7 +1345,8 @@ class Context {
const functionId = uniqueId('function'); const functionId = uniqueId('function');
this.callbacks.set(functionId, { this.callbacks.set(functionId, {
resolve: func, resolve: func,
reject: () => { loge("This should not be called"); } reject: () => { loge("This should not be called"); },
retained: true,
}); });
return functionId; return functionId;
} }

View File

@ -7,6 +7,7 @@ export declare class Context {
callbacks: Map<string, { callbacks: Map<string, {
resolve: Function; resolve: Function;
reject: Function; reject: Function;
retained?: boolean;
}>; }>;
classes: Map<string, ClassType<object>>; classes: Map<string, ClassType<object>>;
hookBeforeNativeCall(): void; hookBeforeNativeCall(): void;

View File

@ -45,6 +45,9 @@ export function jsCallResolve(contextId, callbackId, args) {
} }
hookBeforeNativeCall(context); hookBeforeNativeCall(context);
Reflect.apply(callback.resolve, context, argumentsList); Reflect.apply(callback.resolve, context, argumentsList);
if (callback.retained !== true) {
context.callbacks.delete(callbackId);
}
} }
export function jsCallReject(contextId, callbackId, args) { export function jsCallReject(contextId, callbackId, args) {
const context = gContexts.get(contextId); const context = gContexts.get(contextId);
@ -63,6 +66,9 @@ export function jsCallReject(contextId, callbackId, args) {
} }
hookBeforeNativeCall(context); hookBeforeNativeCall(context);
Reflect.apply(callback.reject, context.entity, argumentsList); Reflect.apply(callback.reject, context.entity, argumentsList);
if (callback.retained !== true) {
context.callbacks.delete(callbackId);
}
} }
export class Context { export class Context {
constructor(id) { constructor(id) {
@ -126,7 +132,8 @@ export class Context {
const functionId = uniqueId('function'); const functionId = uniqueId('function');
this.callbacks.set(functionId, { this.callbacks.set(functionId, {
resolve: func, resolve: func,
reject: () => { loge("This should not be called"); } reject: () => { loge("This should not be called"); },
retained: true,
}); });
return functionId; return functionId;
} }

View File

@ -84,6 +84,9 @@ export function jsCallResolve(contextId: string, callbackId: string, args?: any)
} }
hookBeforeNativeCall(context) hookBeforeNativeCall(context)
Reflect.apply(callback.resolve, context, argumentsList) Reflect.apply(callback.resolve, context, argumentsList)
if (callback.retained !== true) {
context.callbacks.delete(callbackId)
}
} }
export function jsCallReject(contextId: string, callbackId: string, args?: any) { export function jsCallReject(contextId: string, callbackId: string, args?: any) {
@ -103,12 +106,15 @@ export function jsCallReject(contextId: string, callbackId: string, args?: any)
} }
hookBeforeNativeCall(context) hookBeforeNativeCall(context)
Reflect.apply(callback.reject, context.entity, argumentsList) Reflect.apply(callback.reject, context.entity, argumentsList)
if (callback.retained !== true) {
context.callbacks.delete(callbackId)
}
} }
export class Context { export class Context {
entity: any entity: any
id: string id: string
callbacks: Map<string, { resolve: Function, reject: Function }> = new Map callbacks: Map<string, { resolve: Function, reject: Function, retained?: boolean }> = new Map
classes: Map<string, ClassType<object>> = new Map classes: Map<string, ClassType<object>> = new Map
hookBeforeNativeCall() { hookBeforeNativeCall() {
@ -144,7 +150,8 @@ export class Context {
const functionId = uniqueId('function') const functionId = uniqueId('function')
this.callbacks.set(functionId, { this.callbacks.set(functionId, {
resolve: func, resolve: func,
reject: () => { loge("This should not be called") } reject: () => { loge("This should not be called") },
retained: true,
}) })
return functionId return functionId
} }

View File

@ -95,6 +95,9 @@ export function jsCallResolve(contextId: string, callbackId: string, args?: any)
} }
hookBeforeNativeCall(context) hookBeforeNativeCall(context)
Reflect.apply(callback.resolve, context, argumentsList) Reflect.apply(callback.resolve, context, argumentsList)
if (callback.retained !== true) {
context.callbacks.delete(callbackId)
}
} }
export function jsCallReject(contextId: string, callbackId: string, args?: any) { export function jsCallReject(contextId: string, callbackId: string, args?: any) {
@ -114,12 +117,15 @@ export function jsCallReject(contextId: string, callbackId: string, args?: any)
} }
hookBeforeNativeCall(context) hookBeforeNativeCall(context)
Reflect.apply(callback.reject, context.entity, argumentsList) Reflect.apply(callback.reject, context.entity, argumentsList)
if (callback.retained !== true) {
context.callbacks.delete(callbackId)
}
} }
export class Context { export class Context {
entity: any entity: any
id: string id: string
callbacks: Map<string, { resolve: Function, reject: Function }> = new Map callbacks: Map<string, { resolve: Function, reject: Function, retained?: boolean }> = new Map
classes: Map<string, ClassType<object>> = new Map classes: Map<string, ClassType<object>> = new Map
hookBeforeNativeCall() { hookBeforeNativeCall() {
@ -182,7 +188,8 @@ export class Context {
const functionId = uniqueId('function') const functionId = uniqueId('function')
this.callbacks.set(functionId, { this.callbacks.set(functionId, {
resolve: func, resolve: func,
reject: () => { loge("This should not be called") } reject: () => { loge("This should not be called") },
retained: true,
}) })
return functionId return functionId
} }

View File

@ -1252,6 +1252,7 @@ var doric = (function (exports) {
} }
hookBeforeNativeCall(context); hookBeforeNativeCall(context);
Reflect.apply(callback.resolve, context, argumentsList); Reflect.apply(callback.resolve, context, argumentsList);
context.callbacks.delete(callbackId);
} }
function jsCallReject(contextId, callbackId, args) { function jsCallReject(contextId, callbackId, args) {
const context = gContexts.get(contextId); const context = gContexts.get(contextId);
@ -1270,6 +1271,7 @@ var doric = (function (exports) {
} }
hookBeforeNativeCall(context); hookBeforeNativeCall(context);
Reflect.apply(callback.reject, context.entity, argumentsList); Reflect.apply(callback.reject, context.entity, argumentsList);
context.callbacks.delete(callbackId);
} }
class Context { class Context {
constructor(id) { constructor(id) {

File diff suppressed because one or more lines are too long