JSVirtualMachine(Objective-C)官方文档翻译
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSVirtualMachine(Objective-C)官方文档翻译相关的知识,希望对你有一定的参考价值。
参考技术A一个 JSVirtualMachine 实例代表一个执行 javascript 的自包含(self-contained)的环境。你可以用这个类做两件事情:① JavaScript 的并发执行;② 桥接 JavaScript 和 Objective-C 或 Swift 的对象的内存管理。
每一个 JavaScript 上下文(也就是一个 JSContext 对象)归属于一个虚拟机。每一个虚拟机可以包含多个不同的上下文(context),而且可以在不同的上下文(context)之间传值( JSValue 对象)。但是,每一个虚拟机都是独立的——你不能将在一个虚拟机中创建的值传到另一个虚拟机的一个上下文中。
JavaScriptCore 的 API 是线程安全的。比如,你可以在任一线程中创建 JSValue 对象或者执行 scripts,但是,想要使用同一个虚拟机的所有其他线程都需要等待。如果要在多条不同线程上并发执行 JavaScript ,那么你就要确保每一条线程使用的 JSVirtualMachine 实例都是独立的。
当你将一个 Objective-C 或者 Swift 对象转成 JavaScript时,你一定不要在那个对象中存储 JavaScript 值。否则,这将导致循环引用—— JSValue 对象对它们的封闭的 JavaScript 上下文进行了强引用, 而 JSContext 又对要被转成 JavaScript 的原生对象进行了强引用。 你应该用 JSManagedValue 类有条件地持有(retain)一个 JavaScript 值,并且为 managed value向 JavaScriptCore 虚拟机说明原生的拥有关系链(ownership chain)。使用 addManagedReference:withOwner: 和 removeManagedReference:withOwner: 方法向 JavaScriptCore 描述你的原生对象图(object graph)。在你移除了一个对象的最后一个 managed reference 后,那个对象将会被 JavaScript 垃圾回收器(garbage collector)安全销毁。
Initializes a JavaScript virtual machine.
Declaration
Return Value
A new, independent JavaScript virtual machine.
Discussion
Use this initializer to create a virtual machine for use with more than one JavaScript context. By default, creating a JSContext object automatically creates an independent virtual machine—to share a virtual machine between contexts, obtain a JSVirtualMachine instance and then create contexts using the initWithVirtualMachine: initializer.
Availability
Available in ios 7.0 and later.
Notifies the JavaScriptCore virtual machine of an external object relationship.
Declaration
Parameters
Discussion
Use this method to make the JavaScript runtime aware of arbitrary external Objective-C or Swift object graphs. The runtime can then use this information to retain any JavaScript values that are referenced from somewhere in said object graph.
For correct behavior, clients must make their external object graphs reachable from within the JavaScript runtime. If an Objective-C or Swift object is reachable from within the JavaScript runtime, all managed references transitively reachable from it as recorded using the addManagedReference:withOwner: method are scanned by the garbage collector.
Availability
Available in iOS 7.0 and later.
Notifies the JavaScriptCore virtual machine that a previously registered object relationship no longer exists.
Declaration
Parameters
Discussion
Use this method to deregister object relationships recorded using the removeManagedReference:withOwner: method.
The JavaScript garbage collector continues to scan any references that were reported to it until you use this method to remove those references.
Availability
Available in iOS 7.0 and later.
JSVirtualMachine 在内存管理中扮演了什么样的角色?
从变量设置图像名 - 目标c
【中文标题】从变量设置图像名 - 目标c【英文标题】:set imagename from variable - Objective c 【发布时间】:2017-10-05 10:43:28 【问题描述】:想从变量 imgname 中设置 imageNamed。
NSString * imgname = @"hamburger.jpg";
cell.imgview.image = [UIImage imageNamed:@"**Set imgname variable here**"];
我想要这样:cell.imgview.image = [UIImage imageNamed:@"Hamburger.jpg"];
【问题讨论】:
您的问题不清楚,要设置或获取图片名称 imageNamed: 方法将 NSString 作为您的 imageName 实际的参数。这样就可以了: cell.imgview.image = [UIImage imageNamed: imgname]; 是的,但通过这种方法,它会像 cell.imgview.image = [UIImage imageNamed: hamburger.jpg];这是错误的。 . . .我想要 cell.imgview.image = [UIImage imageNamed:@"Hamburger.jpg"]; 你现在有什么问题 【参考方案1】:你不能在 @""
里面写 variable
,你必须像下面的代码一样写下来 -
cell.imgview.image = [UIImage imageNamed:<#(nonnull NSString *)#>];
代替<#(nonnull NSString *)#>
,您只需传递您的NSString Variable
。
cell.imgview.image = [UIImage imageNamed: imgname];
【讨论】:
以上是关于JSVirtualMachine(Objective-C)官方文档翻译的主要内容,如果未能解决你的问题,请参考以下文章
JavaScriptCore学习之JavaScriptCore