WKWebView js交互内存释放问题

JS与OC(WK)交互之页面无法释放 js与wk交互主要是通过WKUserContentController管理,但这样的做的时候我们会遇到一个问题,关闭容器的时候,浏览器发现页面并没有释放,断点发现delloc方法也没有执行。解决方法欢迎留言。。。 (void)dealloc{ [_wkUController removeAllUserScripts]; } 简单的初始化一个WKWebView (void)_initUI{ ... 阅读详情

在WkWebView与JS交互中,我们经常会在原生中注入MessageHandler方法用来与JS建立交互,正常操作在这里我们发现在向JS中注入handler的时候强引用了self,最终导致内存泄漏,使Webview的持有类无法释放,导致了内存泄露,下面进行了相关的解决说明.

该类主要通过ZJJSBridgeHandler桥梁类,弱引用webview,不让webview与controller直接进行js相关交互关联,把关联部分放在桥梁类中,这样webview的controller类就不会造成内存泄露,同时在controller释放回收的时候,清除桥梁类中的所有交互脚本.

给定的事例中,加载的是一个简单的本地html文件,同时也是进行一些简单的js和App交互,通过log一些参数,以及OC主动调用JS函数,弹出一个Alert等.如果有不太明白或者有好的想法,可以留言大家一同探讨学习.

WKWebview js交互内存泄露处理

1.建立一个中间桥梁类ZJJSBridgeHandler
    1. 在该类中弱引用WebView
    1. 弱引用的delegate,用于通信回调
    1. jsMethodsName集合用来记录需要交互的js方法名
2.建立ZJJSBridgeHandlerDelegate 类
  • 1.声明一个用来回调通信的协议方法,代码如下

      @objc protocol ZJJSBridgeHandlerDelegate {
    
    
      /// JS调用OC回调
      /// - Parameters:
      ///   - name: 函数名
      ///   - body: 函数体
      ///   - bridge: 对应的桥梁
      @objc optional  func jsEvent(name:String,body:Any,bridge:ZJJSBridgeHandler)
      
      }
    
3.在ZJJSBridgeHandler 桥梁类中,把webview与相关js交互关联起来,并进行相关回调,声明如下方法
  • 1 添加单个js交互

      /// 添加单个JS交互
      /// - Parameter name: js交互名
      public  func addJSName(_ name:String)  {
          self.jsMethodsName?.insert(name)
          addJSMethodsScript()
      }
    
  • 2 添加一批js交互

      		/// 添加一批js交互
      		/// @param jsNames js函数名数组
      		
      	- (void)addJSNames:(NSArray < NSString *>*)jsNames {
      	    [self.jsNamesSet addObjectsFromArray:jsNames];
      	    [self p_addJSMethodHandler];
      	}
    
  • 3 注入js交互

        ///注入js交互
       func addJSMethodsScript()  {
      weak var weakSelf = self
      guard let _ = jsMethodsName else { return  }
      
      DispatchQueue.main.async {
          for name  in self.jsMethodsName! {
              weakSelf!.webView?.configuration.userContentController.removeScriptMessageHandler(forName: name)
              weakSelf!.webView?.configuration.userContentController.add(weakSelf!, name: name)
          }
          
      }
    

    }

  • 4 .交互回调

      	// MARK: - WKScriptMessageHandler
      func userContentController(_ userContentController: WKUserContentController,
                                 didReceive message: WKScriptMessage) {
          weak var weakSelf = self
          self.delegate?.jsEvent?(name: message.name, body: message.body, bridge: weakSelf!)
      }
    
  • 5 .移除所有交互脚本

      public func removeAllScript()  {
          guard let _ = jsMethodsName else { return  }
          weak var weakSelf = self
          for name  in self.jsMethodsName! {
              weakSelf!.webView?.configuration.userContentController.removeScriptMessageHandler(forName: name)
          }
      }
    
4.下面附上详细的Demo
  • WkWebView js交互
  • 如果上面的连接无法打开,请手动复制该链接: https://github.com/FreshManCode/WKWebViewUse.git

注意:在WebView相关的controller中,要在适应的时机插入以及移除桥梁ZJJSBridgeHandler 中的相关script,否则会导致ZJJSBridgeHandler该类无法被正常回收.

iOS wkwebview的基本使用与基于wkwebview的js、native 交互 源码地址:https://github.com/littleFeng/javaScriptNative.git 最近工作不忙 抽时间看了下iOS8 的 WKWebView ,WKWebView基于WebKit,OSX和iOS开发共用库。 优点:WebKit 使用Nitro JavaScript引擎,webview可以和Safari加载一样快。加载网页占用的内存大大优化。高达60fps的滚动刷新 阅读详情

相关推荐

iOS 8 WkWebView 网页的配置和前进,后退,js 交互和进度条的加载

本文也将讲解到WebKit中更新的WKWebView控件的新特性与使用方法,它很好的解决了UIWebView存在的内存、加载速度等诸多问题。 一、WKWebView新特性 在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存,模拟器加载百度与开源中国网站时,WKWebView占用23M,而UIWebView占用85M); 允许JavaScript的Nitro库

风沙岁月 1万+

WKWebView与JS交互后不释放问题

现在项目中,我们越来越多的使用WKWebView来替换UIWebView。在使用过程中,我们能发现WKWebView的强大之处,但也会发现一些问题,比如说,我们在使用WKWebView与JS做交互后,发现WKWebView不能被释放,下面我们就来解决一下这个问题。 在与后台做交互时,我们首先会创建一个WKWebViewConfiguration WKWebViewConfiguration*con...

weixin_41832561的博客 1257

iOS小技能:WKWebView与JS的交互

文章目录引言I、使用WKWebView替换UIWebView1.1 移除/升级包含UIWebView的第三方SDK(`grep -r "UIWebView" .`)1.2 移除/替换自己项目使用UIWebView API的代码II、升级包含UIWebView的第三方SDK的具体例子2.1 Installing AFNetworking 4.0.1 (was 3.2.1)`正式移除了UIWebView分类`III、 与JS交互(WKWebView)3.1 、JS调用iOS3.1.0 JS代码:3.1.1、

专注于计算机研发知识和资讯分享 3762

WKWebView与JS交互内存不释放问题探究

最近在做一个项目,里面用到了与H5的交互,准确的说是JS端要调用本地的代码,这里要说一下,wkWebView的JS交互与普通的UIWebView是不一样的,而且在JS端代码的编写也是有所不同的,希望大家能跟后台人员做良好的沟通。 废话不多说,直接上代码。。。。 先说说wkWebView与JS交互的方法吧 WKWebViewConfiguration *config = [[WKWebVie

风铃的翼的博客 3301

iOS WKWebView中MessageHandler内存泄漏问题的完美解决过程

主要给大家介绍了关于iOS WKWebView中MessageHandler内存泄漏问题的完美解决过程,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

iOSUIWebView 优化 内存大大降低

项目中我是这样干的,多次点都OK

WKWebView的缓存问题以及如何正确清理缓存

NSURLCache 为您的应用的 URL 请求提供了内存中以及磁盘上的综合缓存机制。 作为基础类库 URL 加载系统 的一部分,任何通过 NSURLConnection 加载的请求都将被 NSURLCache 处理。当然系统有默认的,你也可以自己手动初始化并且给需要的大小以及存储沙盒地址,其实AFNetWorking里面就有+ (NSURLCache *)defaultURLCache {

Deft_MKJing的博客 2万+

Jev模型入门:从API接入到本地部署的完整实践指南

大模型的应用方式正从单一聊天窗口转向复杂的自动化工作流,而推理模型因具备指令跟随与结构化输出能力,成为构建Agent和数据处理管线的关键组件。Jev作为面向通用场景的推理模型,不仅提供了OpenAI兼容的API接口,还支持本地量化部署,兼顾隐私、可控性与长期成本。本文从模型定位出发,明确Jev与基座模型的差异,随后介绍密钥管理、API调用、参数调优,并深入演示基于Ollama与llama.cpp的本地部署流程,包括GGUF模型文件与chat template的匹配要点。针对实践中的常见问题,如密钥泄露、ma

weixin_29057237的博客 359

WKWebView中MessageHandler的内存泄漏问题解决过程

背景项目中使用了WKWebView替换了之前的UIWebView,牵扯到Hybird开发,我们需要和H5交互,所以用到了WKWebViewConfiguration 中的 WKUserContentController所以初始化代码如下 WKUserContentController *userContentController = [[WKUserContentController

王学森的专栏 1万+

MPU6050的四元数解算姿态方法

使用MPU6050硬件DMP解算姿态是非常简单的,下面介绍由三轴陀螺仪和加速度计的值来使用四元数软件解算姿态的方法。 我们先来看看如何用欧拉角描述一次平面旋转(坐标变换): MPU6050的四元数解算姿态方法 设坐标系绕旋转α角后得到坐标系,在空间中有一个矢量在坐标系中的投影为,在内的投影为由于旋转绕进行,所以Z坐标未变,即有。 转换成矩阵形式表示为: 即 所以从旋转到可以写成上面仅仅是绕一根轴的旋转,如果三维空间中的欧拉角旋转要转三次: MPU6050的四元数解算姿态方法 上面得到了一个表示旋转的方

qq_41938005的博客 8393

昆仑通态屏幕制作(连载1)---接触篇

写在开始 背景:最近出了做QT、LORA和4G,还做了一个屏幕。以前做了一个迪文的串口屏幕,发现网上的教程很多,所以连载就不更新了,并且迪文屏幕的设置什么的比较简单,应该从网上都能找到对应的教程。而现在用的昆仑通态的屏幕属于嵌入式屏幕,至于为啥叫嵌入式,也不是很明白,反正就是需要用这个屏幕,嵌入式不嵌入式不重要了。重要的是能用,并且能实现串口屏幕不能实现的功能。所以选定昆仑通态的一款屏幕。 文章语言:我比较习惯用比较糙的语言介绍做的东西,有时候不太准备,但是为了方便理解,还请大家谅解。用...

weixin_45426095的博客 6738

WKWebView问题小结

内存泄漏当需要拦截Web页面的Javascript函数时会使用以下方法- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;在Web页面需要调用以下方法window.webkit.messageHandlers.name.postMessage()

GGGHub的博客 2688

“快速掌握Vivado FPGA开发流程“——详解Vivado开发流程及实例

快速掌握Vivado FPGA开发流程”——详解Vivado开发流程及实例FPGA技术在现代电子领域中应用越来越广泛,而Vivado作为业界最流行的FPGA设计工具之一,也受到越来越多人的关注和使用。那么如何快速掌握Vivado FPGA开发流程呢?本文将详细介绍Vivado开发流程,并通过实例来加深您的理解。首先,我们需要了解Vivado开发流程的主要步骤:创建工程、设计电路、约束电路、生成比特流。接下来,让我们一步步了解这些步骤。

2301_78484069的博客 733

iOS OC与JS交互实战

今天看见有人反对开源的,反对技术分享的,说这是方便了其他开发者,或者说最终是方便了资本家。但是我想说的是我也是从大家的技术分享中一点一点积累的技能,还是需要感谢先驱者的无私分享。 好了OC与JS交互是一个老的技术点,但是我发现网上大多数的文章都是互相抄,千篇一律,没有将里面的关系完全串联讲透。这个功能在开发的时候,避免不了是需要和Web前端沟通的,关键是前端可能也没有开发过这个功能,如果你也能知道一点点前端相关的知识点的话,工作效率会事半功倍。 这篇文章,我不会去装逼的讨论,到...

周为的博客 1672

Unity零基础到入门 ☀️| 【UI系统学习】轻松学会 Unity 的 UGUI基础控件的使用(包括一个简易血条、蓝条设计)

Unity,UGUI。本篇博客来挑几种Unity中最常用的UI控件如何使用和使用技巧,包括一个简易血条蓝条的小实例

努力前行,总会成为自己心中的那道光 2万+

Token 费用爆炸?教你用 Semantic Cache(语义缓存)把 API 成本降低 80%

本文介绍了语义缓存(Semantic Cache)技术在大模型应用中的关键作用。传统Redis缓存基于精确匹配,无法处理用户提问的语义相似性,导致重复调用昂贵的LLM API。语义缓存通过将问题向量化并在向量空间中进行相似度匹配,可识别30%-50%的重复提问,直接返回历史答案。文章详细解析了技术原理(Embedding+向量搜索)、架构设计,并提供了基于Python和ChromaDB的50行核心实现代码。同时指出了生产环境中的三大挑战:阈值设定、隐私保护和多轮对话处理,并给出相应解决方案。该技术能以极低成

BUG猿的博客 1056

因WKWebview导致视图控制器释放不掉而内存崩溃的问题

为什么80%的码农都做不了架构师?>>> ...

weixin_34190136的博客 1052

学习STM32的CAN总线通信

在配置时,确保您启用了CAN总线功能。CAN节点是CAN总线上的一个设备,每个节点都有唯一的标识符。在CAN总线中,有两种类型的节点:CAN控制器和CAN外设。步骤2:配置CAN总线 在STM32CubeMX中,选择CAN总线模块并进行必要的配置。在CAN总线中,有两个重要的概念:CAN节点和CAN帧。步骤5:测试CAN总线通信 在成功编译和烧录代码后,您可以使用串口调试助手或其他CAN总线工具来测试CAN总线通信。步骤3:编写CAN总线通信代码 在项目的主代码文件中,我们将编写CAN总线通信的示例代码。

2401_85258012的博客 497

iOS 添加WKWebView导致控制器无法释放的问题

在WkWebView与JavaScript交互中,经常会在原生中注入MessageHandler,app中注入MessageHandler的方法 WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; config.userContentController = [WKUserCont...

dianchidu6913的博客 1138

YOLOv11 改进 - 注意力机制 | 空间增强注意力SEAM(Spatially Enhanced Attention Module)提升遮挡场景检测鲁棒性

本文介绍了分离与增强注意力模块(SEAM)在YOLOv11中的结合应用。SEAM模块旨在增强面部特征学习能力,特别是处理面部遮挡问题。它采用多头注意力机制强调面部区域、抑制背景区域,第一部分使用深度可分离卷积减少参数并学习通道重要性,通过1x1卷积增强通道联系,利用两层全连接网络融合通道信息,经指数归一化后作为注意力权重与原始特征相乘。我们将SEAM集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,该方法有助于提升模型检测性能。

魔改工程师的博客 1667

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

WKWebView与JS交互

WKWebView是苹果在iOS8推出的,用来替换UIWebView,相比UIWebView,WKWebView速度更快,占用内存更少。 Objective-C与JS交互的办法大致有: 1、UIWebView拦截URL和WKWebView拦截URL。 2、UIWebView调用JavaScriptCore,JavaScriptCore是iOS7新添加的框架。 3、WKWebView使用WK

天下只此一家的专栏 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

WKWebView详解&WKWebVieW和JS交互

开发App的过程中,常常会遇到在App内部加载网页,通常用UIWebView加载。而这个自iOS2.0开始使用的Web容器一直是开发的心病:加载速度慢,占用内存多,优化困难。如果加载网页多,还可能因为过量占用内存而给系统kill掉。各种优化的方法效果也不那么明显iOS8 以后,苹果推出了新框架 WebKit,提供了替换 UIWebView 的组件 WKWebView。各种 UIWebView 的性能问题没有了,速度更快了,占用内存少了,体验更好了,下面列举一些其它的优势: 1、在性能、稳定性、功能方面有很.

蜗牛的小房子 2429

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

wkwebview加载完成_【Swift】WKWebView与JS的交互使用

一、前言近日,有朋友问我关于WKWebView与JS的交互问题,可我之前一直使用的是UIWebView,也不曾做过WKWebView的交互啊!接下来大家一块学习下WKWebView是怎么实现原生代码和JS交互的。二、WKWebView支持更多的HTML5的特性高达60fps滚动刷新频率与内置手势与Safari相容的JavaScript引擎在性能、稳定性方面有很大提升占用内存更少 协议方法及功能都更...

weixin_39881575的博客 1549

iOS WKWebView JS 与 原生交互

一些说明: 在iOS开发中难免会用到网页,在iOS 8以前,我们更喜欢使用UIWebView,但是UIWebView有很多弊端,首先它有一个最让人头疼的问题就是内存会暴增,并且释放不掉,而且苹果开放出来的接口相对较少,目前用Xcode 9进行iOS开发,其支持最低的系统版本号为iOS 9.0,目前所在的公司也并没有要求对iOS 8.0以前版本进行适配于是,在新的项目中打算摒弃UIWebView而采...

u598975767的专栏 1569

IOS UIWebView转WKWebView中的js交互问题

1.UIWebView占用的内存比WKWebView多不少,IOS8以后使用WKWebview。 2.在UIWebView中html中的alert、confirm、prompt会弹出窗口,但是在WKWebView中不会弹出了,转换成了ios中WKUIDelegate回调,WKUIDelegate主要处理与JS交互的,WKNavigationDelegate主要处理WKWebView的一些网页加载

liu_bin_home的博客 1463
上一篇: Swift URLEncode
下一篇: React 跨组件传递事件
FreshManCode
博客等级 码龄9年 8粉丝 15原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值