//定义需要暴露给js的内容,这里我们只暴露personName和queryPersonName接口

@protocol PersonProtocol <JSExport>

@property(nonatomic,copy)NSString *personName;

-(NSString *)queryPersonName;

@end

//Person实现PersonProtocol协议,而自己定义的age和queryPersonAge接口不暴露给js

@interface Person : NSObject <PersonProtocol>

@property(nonatomic,assign)NSInteger age;

-(NSInteger)queryPersonAge;

@end

@implementation Person

@synthesize personName = _personName;

-(NSString *)queryPersonName{

return self.personName;

}

-(NSInteger)queryPersonAge{

return self.age;

}

@end

-(void)testXXX

{

JSContext *context = [[JSContext alloc] init];

//创建Person类的对象,将他赋值给js对象

Person *person=[Person new];

person.personName = @"Greg";

person.age = 27;

context[@"person"]=person;

JSValue *kValue = context[@"person"];

//可以调用获取PersonProtocol暴露的内容

NSString *personName = [[context evaluateScript:@"person.personName"] toString]; //"Greg"

NSString *personName1 = [[context evaluateScript:@"person.queryPersonName()"] toString]; //"Greg"

//js无法调用跟age相关的内容

NSInteger age = [[context evaluateScript:@"person.age"] toInt32]; // 0

NSInteger age1 = [[context evaluateScript:@"person.queryPersonAge()"] toInt32]; //0

}

* thread #1: tid = 0x15f9d0, 0x0000000109bfcb00 jsContextTest`-[Person queryPersonName](self=0x00007fc74be117f0, _cmd="queryPersonName") + 16 at ViewController.m:28, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1

* frame #0: 0x0000000109bfcb00 jsContextTest`-[Person queryPersonName](self=0x00007fc74be117f0, _cmd="queryPersonName") + 16 at ViewController.m:28

frame #1: 0x000000010a57a5cc CoreFoundation`__invoking___ + 140

frame #2: 0x000000010a57a41e CoreFoundation`-[NSInvocation invoke] + 286

frame #3: 0x000000010ae0adb3 JavaScriptCore`JSC::ObjCCallbackFunctionImpl::call(JSContext*, OpaqueJSValue*, unsigned long, OpaqueJSValue const* const*, OpaqueJSValue const**) + 451

frame #4: 0x000000010ae0a926 JavaScriptCore`JSC::objCCallbackFunctionCallAsFunction(OpaqueJSContext const*, OpaqueJSValue*, OpaqueJSValue*, unsigned long, OpaqueJSValue const* const*, OpaqueJSValue const**) + 262

frame #5: 0x000000010ae0bbad JavaScriptCore`long long JSC::APICallbackFunction::call<JSC::ObjCCallbackFunction>(JSC::ExecState*) + 573

frame #6: 0x000000010add5340 JavaScriptCore`JSC::LLInt::setUpCall(JSC::ExecState*, JSC::Instruction*, JSC::CodeSpecializationKind, JSC::JSValue, JSC::LLIntCallLinkInfo*) + 528

frame #7: 0x000000010addc35d JavaScriptCore`llint_entry + 22900

frame #8: 0x000000010add67d9 JavaScriptCore`vmEntryToJavaScript + 326

frame #9: 0x000000010aca8959 JavaScriptCore`JSC::JITCode::execute(JSC::VM*, JSC::ProtoCallFrame*) + 169

frame #10: 0x000000010ac8f264 JavaScriptCore`JSC::Interpreter::execute(JSC::ProgramExecutable*, JSC::ExecState*, JSC::JSObject*) + 10404

frame #11: 0x000000010aa9f786 JavaScriptCore`JSC::evaluate(JSC::ExecState*, JSC::SourceCode const&, JSC::JSValue, WTF::NakedPtr<JSC::Exception>&) + 470

frame #12: 0x000000010acedfb8 JavaScriptCore`JSEvaluateScript + 424

frame #13: 0x000000010acfcd09 JavaScriptCore`-[JSContext evaluateScript:withSourceURL:] + 105

frame #14: 0x0000000109bfd3f2 jsContextTest`-[ViewController testXXX](self=0x00007fc74bd4e4e0, _cmd="testXXX") + 370 at ViewController.m:91

frame #15: 0x000000010b189a8d UIKit`-[UIApplication sendAction:to:from:forEvent:] + 92

frame #16: 0x000000010b2fce67 UIKit`-[UIControl sendAction:to:forEvent:] + 67

frame #17: 0x000000010b2fd143 UIKit`-[UIControl _sendActionsForEvents:withEvent:] + 327

frame #18: 0x000000010b2fc263 UIKit`-[UIControl touchesEnded:withEvent:] + 601

frame #19: 0x000000010b1fc99f UIKit`-[UIWindow _sendTouchesForEvent:] + 835

frame #20: 0x000000010b1fd6d4 UIKit`-[UIWindow sendEvent:] + 865

frame #21: 0x000000010b1a8dc6 UIKit`-[UIApplication sendEvent:] + 263

frame #22: 0x000000010b182553 UIKit`_UIApplicationHandleEventQueue + 6660

frame #23: 0x000000010a5b7301 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17

frame #24: 0x000000010a5ad22c CoreFoundation`__CFRunLoopDoSources0 + 556

frame #25: 0x000000010a5ac6e3 CoreFoundation`__CFRunLoopRun + 867

frame #26: 0x000000010a5ac0f8 CoreFoundation`CFRunLoopRunSpecific + 488

frame #27: 0x000000010e68cad2 GraphicsServices`GSEventRunModal + 161

frame #28: 0x000000010b187f09 UIKit`UIApplicationMain + 171

frame #29: 0x0000000109bfd90f jsContextTest`main(argc=1, argv=0x00007fff56003638) + 111 at main.m:14

frame #30: 0x000000010d5c292d libdyld.dylib`start + 1

frame #31: 0x000000010d5c292d libdyld.dylib`start + 1

oc js 调用 函数调用栈的更多相关文章

  1. iOS JS 交互之利用系统JSContext实现 JS调用OC方法以及Objective-C调用JavaScript方法

    ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择拷贝到工程中,(拖入的文件夹是蓝色 ...

  2. iOS JS 交互之利用系统JSContext实现 JS调用oc方法

    ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择如下操作,(拖入的文件夹是蓝色的, ...

  3. iOS开发--JS调用原生OC篇

    JS调用原生OC篇 方式一(反正我不用) 第一种方式是用JS发起一个假的URL请求,然后利用UIWebView的代理方法拦截这次请求,然后再做相应的处理. 我写了一个简单的HTML网页和一个btn点击 ...

  4. JS调用OC方法并传值,OC调用JS方法并传值////////////////////////zz

     iOS开发-基于原生JS与OC方法互相调用并传值(附HTML代码)     最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点 ...

  5. [iOS Hybrid实践:UIWebView中Html中用JS调用OC方法,OC执行JS代码]

    原理: 1.JS调用OC 每次webview执行跳转时都会被iOS给拦截,执行下面函数获得系统允许. 因此可以根据跳转信息转给系统,执行相应功能,比如打开相册等. // 网页中的每一个请求都会被触发 ...

  6. UIWebView中Html中用JS调用OC方法及OC执行JS代码

    HTML代码: <html> <head> <title>HTML中用JS调用OC方法</title> <meta http-equiv=&quo ...

  7. iOS js oc相互调用(JavaScriptCore)(二)

    下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的block 上代码 -(void)we ...

  8. iOS 关于js与OC相互调用的那些事

    最近项目上使用js调用OC,OC再次调用JS,再次在JS页面上面回显数据. 项目中使用的是WKWebview,加载网路的URL,其实就是使用WK加载出来的H5网页,在项目中用的是H5网页有个识别按钮, ...

  9. iOS js oc相互调用(JavaScriptCore 下)

    下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的block 上代码 -(void)we ...

随机推荐

  1. WebUtility(提供在处理 Web 请求时用于编码和解码 URL 的方法。)

    public static string UrlEncode( string str ) UrlEncode(String) 方法可用来编码整个 URL,包括查询字符串值. 如果没有编码情况下,如空格 ...

  2. [PHP] 通用网关接口CGI 的运行原理

    CGI 的运行原理:1.客户端访问某个 URL 地址之后,通过 GET/POST/PUT 等方式提交数据,并通过 HTTP 协议向 Web 服务器发出请求.2.服务器端的 HTTP Daemon(守护 ...

  3. No Mapping For GET "xxx.do"

    今天写的一个form表单提交时总是报错找不到mapping,form如下: <form action="toUpdate.do" method="post" ...

  4. K:找寻数组中第n大的数组元素的三个算法

    相关介绍:  给定一个数组,找出该数组中第n大的元素的值.其中,1<=n<=length.例如,给定一个数组A={2,3,6,5,7,9,8,1,4},当n=1时,返回9.解决该问题的算法 ...

  5. C#语言总结1

    C#C#定义: C#是一门面向对象.面向组件的一门语言,是.NET的一部分. 程序结构: 命名空间 类{ 属性 方法 main函数入口 } 数据类型: C#的数据类型分为:值类型(Value type ...

  6. DOM3 textInput事件

    DOM3中引入了文本事件,其中之一 textInput . 当用户再可编辑区域输入字符时触发该事件. 与keypress不同的是,该事件只会在用户输入可视字符时触发,而keypres事件则只要按下键即 ...

  7. react context toggleButton demo

    //toggleButton demo: //code: //1.Appb.js: import React from 'react'; import {ThemeContext, themes} f ...

  8. JS 和 a href className JS编写顺序与运行顺序 字符串或变量嵌入中括号 代替 点号 代表属性

    JS 和 a href 在href里面注意分号结尾, 引号闭合 <a href="javascript:;">空链接</a> <a href=&quo ...

  9. 伪元素::before与::after的用法

    ::before与::after两个伪元素其实是CSS3中的内容,然而实际上在CSS2中就已经有了这两者的身影,只不过CSS2中是前面加一个冒号来表示(:before和:after).今天主要讲讲这两 ...

  10. 全面认识Docker和基本指令

    Docker逐渐成为虚拟化技术的佼佼者,Java架构师之路接下来会推出一系列的Docker相关技术文章,Docker技术也是架构师的必备技能. 什么是Docker Docker 是一个开源的应用容器引 ...