我在尝试使用JSManagedValue时遇到了问题.根据我在WWDC 2013上基于Session 615的理解,当你想要从Objective-C到Javascript的引用时,反之亦然,你需要使用JSManagedValue而不是仅仅在Objective-C中存储JSValue以避免引用周期.
这是我试图做的精简版.我有一个ViewController,它需要一个Javascript对象的引用,并且Javascript对象需要能够在ViewController上调用一个方法.ViewController有一个UILabel,它显示一个计数,并有两个UIButtons,'Add'递增计数,'Reset',用一个新的ViewController创建并替换当前的视图控制器(基本上我只能验证旧的ViewController)在我测试时正确清理干净).
在viewDidLoad,ViewController调用updateLabel并能够从Javascript对象中正确获取计数.但是,在运行循环结束后,Instruments正在显示JSValue正在发布.ViewController仍然存在,它的JSManagedValue也是如此,所以我认为应该防止JSValue被垃圾收集,但_managedValue.value现在返回nil.
如果我只是存储JSValue而不是使用JSManagedValue,那么它在视觉上都是可行的,但是ViewController和JSValue之间存在一个引用循环,正如预期的那样,并且Instruments确认ViewControllers永远不会被释放.
Javascript代码:
(function() {
var _count = 1;
var _view;
return {
add: function() {
_count++;
_view.updateLabel();
},
count: function() {
return _count;
},
setView: function(view) {
_view = view;
}
};
})()
Run Code Online (Sandbox Code Playgroud)
CAViewController.h
@protocol CAViewExports <JSExport>
- (void)updateLabel;
@end
@interface CAViewController : UIViewController<CAViewExports>
@property (nonatomic, weak) IBOutlet UILabel *countLabel;
@end
Run Code Online (Sandbox Code Playgroud)
CAViewController.m
@interface CAViewController () {
JSManagedValue *_managedValue;
}
@end
@implementation CAViewController
- (id)init { …Run Code Online (Sandbox Code Playgroud) 我通过IOS 7引入的新JavaScriptCore.framework Objective-C API将Javascript嵌入到我的IOS 7应用程序中.
对于那些在Objective-C和Javascript之间寻找这个良好集成桥梁的介绍的人,请查看Apple开发者网络上的WWDC介绍"将JavaScript集成到本机应用程序"会话:https: //developer.apple.com/wwdc/videos /?id = 615.
编辑:WWDC 2013的视频集现已移至此处:https://developer.apple.com/videos/wwdc/2013/?id = 615
我遇到的问题是我的NSDate对象(通过args和直接设置Javascript变量)似乎被严重转换为Javascript日期.这是我的代码:
self.javascriptContext[@"consoleLog"] = ^(NSString *message) {
NSLog(@"Javascript log: %@",message);
};
NSDate *myDate = [NSDate date];
NSDateFormatter *dateFormatter = [NSDateFormatter new];
[dateFormatter setDateFormat:@"EEE MMM dd yyyy HH:mm:ss 'GMT'ZZZ"]; // Show in same format as javascript
NSLog(@"myDate = %@", [dateFormatter stringFromDate:myDate]);
self.javascriptContext[@"date1"] = myDate;
[self.javascriptContext evaluateScript:@"var myDateFn = function(dateArg) { consoleLog(\"date1 = \" + date1); consoleLog(\"dateArg = \" + dateArg); return dateArg …Run Code Online (Sandbox Code Playgroud) 给定一个不依赖于任何Node.js功能的Node.js模块,除了modules(export/require)如何使用JS核心从Objective-C或Swift访问其函数?
var compute = function compute(number) {
return 2 * number
};
exports.compute = compute;
Run Code Online (Sandbox Code Playgroud)
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var compute = function compute(number) {
return 2 * number
};
exports.compute = compute;
},{}]},{},[1])
Run Code Online (Sandbox Code Playgroud)
代码波纹管似乎没有能够找到compute中的函数bundle.js-的result是NaN.
var path = b.pathForResource("bundle", ofType: "js")
var source : String = NSString.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: …Run Code Online (Sandbox Code Playgroud) 我需要帮助从测试用户了解此崩溃日志.我没有在我的应用程序中编写任何与JavaScriptCore相关的代码.
我仍然不知道如何重现这次崩溃.任何关于这个问题的见解都有助于我找到这个问题.
谢谢,
PS我的应用程序正在使用Admob中介.我不知道它是否与此有某种关系.
Incident Identifier: 7B6EFFFF-4D55-48AE-8FE8-A55590405F0A
CrashReporter Key: ef1ad783966254a93308221f30f17134c95879f7
Hardware Model: iPad5,3
Process: ???? [2325]
Path: /private/var/mobile/Containers/Bundle/Application/16AE72E1-A8C8-45D9-955F-A6F96FCCE800/????.app/????
Identifier: ????
Version: 3.75.14 (3.75)
Code Type: ARM-64 (Native)
Parent Process: launchd [1]
Date/Time: 2015-05-16 10:36:50.459 -0700
Launch Time: 2015-05-16 10:00:10.481 -0700
OS Version: iOS 8.3 (12F69)
Report Version: 105
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x00000000bbadbeef
Triggered by Thread: 4
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0:
0 libsystem_kernel.dylib 0x0000000197080e0c mach_msg_trap + 8
1 libsystem_kernel.dylib 0x0000000197080c84 mach_msg + …Run Code Online (Sandbox Code Playgroud) 有没有办法强制iOS(或Mac OS)JavaScriptCore VM垃圾收集器运行?我只需要测试内存泄漏,所以私有API就可以了.
我们有一个带有UIWebView的iOS应用程序,用于加载YouTube iframe播放器以播放YouTube视频.iOS 11.3发布后,我们发现有很多javascript核心崩溃.在Fabric crashlytics上,崩溃stcktrace看起来像这样
Crashed: WebThread
0 JavaScriptCore 0x18aa48298 JSC::JSLock::DropAllLocks::DropAllLocks(JSC::VM&) + 176
1 JavaScriptCore 0x18aa4826c JSC::JSLock::DropAllLocks::DropAllLocks(JSC::VM&) + 132
2 WebCore 0x18b78b794 SendDelegateMessage(NSInvocation*) + 360
3 WebKitLegacy 0x18cea7c68 CallDelegate(void (*)(), WebView*, objc_object*, objc_selector*, objc_object*, objc_object*, objc_object*) + 144
4 WebKitLegacy 0x18ce1b8d0 WebFrameLoaderClient::dispatchDidFailLoading(WebCore::DocumentLoader*, unsigned long, WebCore::ResourceError const&) + 276
5 WebCore 0x18b7ba660 WebCore::ResourceLoadNotifier::didFailToLoad(WebCore::ResourceLoader*, WebCore::ResourceError const&) + 128
6 WebCore 0x18b7ba118 WebCore::ResourceLoader::cancel(WebCore::ResourceError const&) + 464
7 WebCore 0x18b7b9ea4 WebCore::ResourceLoader::cancel() + 64
8 WebCore 0x18c6bbe90 WebCore::CachedResource::removeClient(WebCore::CachedResourceClient&) + 264
9 WebCore 0x18c680558 WebCore::MediaResource::~MediaResource() + 64 …Run Code Online (Sandbox Code Playgroud) 我对JS(ES6)中的"按位左操作符"的理解是,右边的空白用零填充.
然而,根据经验,我注意到在V8和JSC中,如果我们移动64或更多,设置位似乎突然重新出现.
(255 << 64).toString(2)
//-> "11111111"
Run Code Online (Sandbox Code Playgroud)
这与我的预期相反,即更大的变化将无限期地产生右边的零.
我没有立即在EcmaScript 2016页面中看到这种行为在<< - 我错过了什么,或者对于较大的班次可能是未定义的行为?
我刚刚从客户的设备上获得了崩溃日志,而且它崩溃了:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
JSContext *javaScriptContext = [[JSContext alloc] init];
Run Code Online (Sandbox Code Playgroud)
这是崩溃日志:
Thread 11 Crashed:
0 JavaScriptCore 0x31009cd6 WTFCrash + 54
1 JavaScriptCore 0x30e0edf6 WTF::OSAllocator::reserveAndCommit(unsigned long, WTF::OSAllocator::Usage, bool, bool, bool) + 166
2 JavaScriptCore 0x30e0ed2a WTF::OSAllocator::reserveUncommitted(unsigned long, WTF::OSAllocator::Usage, bool, bool, bool) + 14
3 JavaScriptCore 0x30e14736 JSC::JSStack::JSStack(JSC::VM&, unsigned long) + 74
4 JavaScriptCore 0x30e146d2 JSC::Interpreter::Interpreter(JSC::VM&) + 22
5 JavaScriptCore 0x30e10fb8 JSC::VM::VM(JSC::VM::VMType, JSC::HeapType) + 2516
6 JavaScriptCore 0x30fbf48e JSC::VM::createContextGroup(JSC::HeapType) + 22
7 JavaScriptCore 0x30fbdc86 JSContextGroupCreate + 14
8 JavaScriptCore 0x30fd209e -[JSVirtualMachine init] …Run Code Online (Sandbox Code Playgroud) cocoa-touch objective-c grand-central-dispatch ios javascriptcore
考虑一下:
@protocol FooExport <JSExport>
- (void)method1:(NSString *)param1;
- (void)method2:(NSString *)param1 param2:(NSString *)param2;
@end
@interface Foo : NSObject <FooExport>
@end
@implementation Foo
- (void)method1:(NSString *)param1 {
NSLog(@"method1");
}
- (void)method2:(NSString *)param1 param2:(NSString *)param2 {
NSLog(@"method2");
}
@end
{
sContext = [[JSContext alloc] init];
if (sContext)
{
sContext[@"foo"] = [[Foo alloc] init];
[sContext evaluateScript:@"foo.method1(\"foo\");"]; // method1 is called
[sContext evaluateScript:@"foo.method2(\"foo\", \"bar\");"]; // method2 is NOT called
}
}
Run Code Online (Sandbox Code Playgroud)
调用method1就好了但是从不调用method2.
如果我按如下方式更改method2:
@protocol FooExport <JSExport>
- (void)method1:(NSString *)param1;
- (void)method2:(NSString *)param1;
@end
Run Code Online (Sandbox Code Playgroud)
method2现在通过[sContext evaluateScript:@"foo.method2(\"foo …
我们正在Android上构建React Native应用程序.我们需要在线程中创建单独的JSC虚拟机实例.我们不想使用React Native使用的相同JSC上下文.
我们在网上搜索了很多,并试图弄清楚React Native如何使用JSC,但我们无法找到相同的东西.
如果有人可以向我们提出相同的指示,将会非常有帮助.
javascriptcore ×10
ios ×6
objective-c ×4
javascript ×3
browserify ×1
cocoa-touch ×1
crash ×1
ios7 ×1
macos ×1
node.js ×1
nsdate ×1
react-native ×1
uiwebview ×1
v8 ×1