JSPatch
JSPatch copied to clipboard
主线程卡死问题
OC部分:
一个简单对象
@interface NewObject : NSObject
@property (nonatomic,strong) NSString *property1;
@end
@implementation NewObject
@end
ViewController中人为点击触发toTestJSPath
-(void)toTestJSPath:(id)sender
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
for (NSUInteger i = 0; i <15; i++)
{
[self doBackGroupThread:i];
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
for (NSUInteger i = 0; i <15; i++)
{
[self testBlock:nil];
}
});
}
-(void)doBackGroupThread:(NSUInteger)i
{
}
-(void)doSomeThing:(NSUInteger)i
{
// _obj为NewObject
[_obj property1];
}
JS补丁部分:
defineClass('ViewController', {
doBackGroupThread: function(i) {
var slt = self;
dispatch_async_main(function() {
slt.doSomeThing(i);
});
},
testBlock: function(sender) {
}
});
defineClass('NewObject', {
property1: function() {
}
});
说明:
如上基本上都会卡死主线程,我修改dispatch_async_main扩展就不会卡死了
context[@"dispatch_async_main"] = ^(JSValue *func) {
dispatch_async(dispatch_get_main_queue(), ^{
[_JSMethodForwardCallLock lock];
[func callWithArguments:nil];
[_JSMethodForwardCallLock unlock];
});
};
子线程调doBackGroupThread-> JSMethod Lock -> dispatch_async_main -> 调 JS 的 doSomeThing -> 等待 JSMethod Lock -> 死锁 确实是有这问题
想错了,调dispatch_async_main后未调doSomeThing时这段JS已经执行完,JSMethod Lock已经解锁了。还没想明白
@bang590 这个问题 有方案木 bang 哥 demo 上次发给你了
@bang590 昨天还遇到复写一个子线程函数 然后这个函数被oc子线程触发到js执行报错: FATAL ERROR: JavaScript garbage collection failed because thread_get_state returned an error (268435459). This is probably the result of running inside Rosetta, which is not supported. /SourceCache/JavaScriptCoreEmbedded/JavaScriptCoreEmbedded-1218.35/heap/MachineStackMarker.cpp(350) : size_t JSC::getPlatformThreadRegisters(const PlatformThread &, PlatformThreadRegisters &)
@ganvinalix JavaScript garbage collection failed 这问题解决了吗? 我修复tableView_cellForRowAtIndexPath,iPhone 4s报同样的错误
@dw0625 没有子线程调用js替换函数某种情况下导致的问题