标签: javascriptcore

如何在没有JSValue发布的情况下使用JSManagedValue来避免引用循环?

我在尝试使用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)

javascript objective-c javascriptcore

5
推荐指数
1
解决办法
1362
查看次数

与IOS 7一起引入的JavaScriptCore.framework Objective-C API给出了一个糟糕的NSDate转换(BUG?)

我通过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)

objective-c nsdate javascriptcore ios7

5
推荐指数
1
解决办法
1091
查看次数

如何使用Browserify和iOS JavaScriptCore

给定一个不依赖于任何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)

Browserified bundle(bundle.js):

(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)

SWIFT代码:

代码波纹管似乎没有能够找到compute中的函数bundle.js-的resultNaN.

var path = b.pathForResource("bundle", ofType: "js")
var source : String = NSString.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: …
Run Code Online (Sandbox Code Playgroud)

javascript node.js ios javascriptcore browserify

5
推荐指数
1
解决办法
1219
查看次数

WebThread JavaScriptCore崩溃 - 此崩溃报告的含义

我需要帮助从测试用户了解此崩溃日志.我没有在我的应用程序中编写任何与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)

crash-reports ios javascriptcore

5
推荐指数
1
解决办法
3727
查看次数

在iOS上强制JavaScriptCore虚拟机的垃圾收集

有没有办法强制iOS(或Mac OS)JavaScriptCore VM垃圾收集器运行?我只需要测试内存泄漏,所以私有API就可以了.

macos garbage-collection ios javascriptcore

5
推荐指数
1
解决办法
1711
查看次数

在iOS 11.3中的UIWebView中使用YouTube iframe播放器时,Javascript核心崩溃

我们有一个带有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)

crash uiwebview ios youtube-javascript-api javascriptcore

5
推荐指数
0
解决办法
671
查看次数

JavaScript ES6(<<)中的按位左移是否超过63的移位?

我对JS(ES6)中的"按位左操作符"的理解是,右边的空白用零填充.

然而,根据经验,我注意到在V8和JSC中,如果我们移动64或更多,设置位似乎突然重新出现.

(255 << 64).toString(2)
//-> "11111111" 
Run Code Online (Sandbox Code Playgroud)

这与我的预期相反,即更大的变化将无限期地产生右边的零.

我没有立即在EcmaScript 2016页面中看到这种行为在<< - 我错过了什么,或者对于较大的班次可能是未定义的行为?

javascript v8 javascriptcore

5
推荐指数
1
解决办法
66
查看次数

我应该避免在全局队列中创建JSContexts吗?

我刚刚从客户的设备上获得了崩溃日志,而且它崩溃了:

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

4
推荐指数
1
解决办法
2651
查看次数

JSExport不能使用多个参数的Objective-C方法吗?

考虑一下:

@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 …

objective-c ios javascriptcore

4
推荐指数
1
解决办法
2475
查看次数

如何在React Native android应用程序中使用JavaScriptCore

我们正在Android上构建React Native应用程序.我们需要在线程中创建单独的JSC虚拟机实例.我们不想使用React Native使用的相同JSC上下文.

我们在网上搜索了很多,并试图弄清楚React Native如何使用JSC,但我们无法找到相同的东西.

如果有人可以向我们提出相同的指示,将会非常有帮助.

javascriptcore react-native

4
推荐指数
1
解决办法
2868
查看次数