文档 JavaScript自动化有一个内置的Objective-C Bridge,使您能够访问文件系统,创建Cocoa应用程序。 Objective-C Bridge的主要接入点是全局属性objc$

Frameworks

Foundation framework中的语法默认支持JavaScript自动化。也可以通过使用ObjC.import()方法导入其他Frameworks 和 libraries。 例如,使用Cocoa框架中的NSBeep()函数,需要导入Cocoa框架 {% codeblock lang:js %} ObjC.import(‘Cocoa’) $.NSBeep() {% endcodeblock %} 除了系统框架之外,一些系统库的功能也被暴露出来。这个功能可以通过头文件的名称来暴漏出来(不带.h) 例如:
arpa/inet, asl, copyfile, dispatch, dyld, errno, getopt, glob, grp, ifaddrs, launch, membership, netdb, netinet/in, notify, objc, paths, pwd, readline, removefile, signal, spawn, sqlite3, stdio, stdlib, string, sys/fcntl, sys/file, sys/ioctl, sys/mount, sys/param, sys/resource, sys/socket, sys/stat, sys/sysctl, sys/time, sys/times, sys/types, sys/wait, sys/xattr, syslog, time, unistd, uuid/uuid, vImage, vecLib, vmnet, xpc, 和 zlib. 导入框架时,系统将参考桥接支持文件。除了内置的框架和库,您可以导入任何具有桥接支持的框架,只需要将完整路径传递给框架,如下示例: {% codeblock lang:js %} ObjC.import(’/Library/Frameworks/Awesome.framework’) {% endcodeblock %}

数据类型

原始的JavaScript数据类型映射到C数据类型。例如,一个JavaScript字符串映射为char *,而JavaScript整数映射到int。使用objc API返回一个char *时,会得到一个JS 字符串

原始的JavaScript数据类型将被自动转换为ObjC对象类型,并能作为一个预期的对象类型的参数传递给ObjC方法。 例如,一个JS字符串将被转换为一个NSString对象如果是什么方法签名说应该是输入。

注意,然而,ObjC方法返回的ObjC对象类型是不会自动转换为原始的JavaScript的数据类型。

实例化的类和调用方法

所有类都定义为$对象的属性。ObjC对象的方法有两种方式调用,根据是否需要参数的方法。 如果ObjC方法不带参数,然后调用JavaScript属性名访问属性值。这个例子中实例化一个空的字符串。 {% codeblock lang:js %} str = $.NSMutableString.alloc.init {% endcodeblock %} 如果ObjC方法不带参数,根据JSExport规范来命名,通过JavaScript的方法调用(function-typed property); 对于多参数的方法,Objective-C的方法每个部分都合并在一起,冒号后的字母变为大写并移除冒号。比如下边协议中的方法,在JavaScript调用就是:doFooWithBar(foo, bar); 这个例子说明JavaScript字符串转为NSString然后写入到一个文件 {% codeblock lang:js %} str = $.NSString.alloc.initWithUTF8String(‘foo’) str.writeToFileAtomically(’/tmp/foo’, true) {% endcodeblock %}

如果你调用一个方法,如-intValue,返回C数据类型而不是一个对象,然后你会回到原始的JavaScript数据类型。 此示例返回原始的JavaScript的整数,99。 {% codeblock lang:js %} $.NSNumber.numberWithInt(99).intValue {% endcodeblock %}

访问 ObjC Properties

ObjC属性也可以通过JavaScript属性来访问,很像调用无参数方法。 当一个桥接对象属性的被访问时,ObjC属性列表是第一参考,如果列表中存在该名称对应的属性,那么就调用相应属性的gettersetter选择器。如果该名称的ObjC属性不在类中属性的列表中,那么该属性名称就作为方法选择器来调用。 使用自定义getter名定义一个属性,你可以使用属性名 或 getter名,并得到相同的结果。 {% codeblock lang:js %} task = $.NSTask.alloc.init task.running == task.isRunning {% endcodeblock %} 另外,不同的参数方法,桥接对象属性映射到ObjC属性也可以设置为(read/write属性)。下面的两行定义了一个ObjC属性:launchPath。 {% codeblock lang:js %} task.launchPath = ‘/bin/sleep’ task.setLaunchPath(’/bin/sleep’) {% endcodeblock %}