58同城
动态库和静态库
我们创建的一般都是静态库,可以制作动态库,不允许上架app store的
iOS8,swift以后,出现了阉割版的Extension动态库。这种动态库允许APP和APP Extension共享代码
静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝
系统动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
iOS有没有动态库
iOS的动态库(被阉割的动态库)
iOS8之前因为 iOS 应用都是运行在沙盒当中,不同的程序之间不能共享代码,并且iOS是单进程的,也就是某一时刻只有一个进程在运行,那么你写个共享库,给谁共享呢。同时动态下载代码又是被苹果明令禁止的,没办法发挥出动态库的优势,综上所以上动态库也就没有存在的必要了。
但是后来iOS8之后,iOS有了App Extesion特性,而且Swift也诞生了。由于iOS主App需要和Extension共享代码,Swift语言机制也需要动态库,于是苹果后来提出了Embedded Framework,这种动态库允许APP和APP Extension共享代码,但是这份动态库的生命被限定在一个APP进程内。简单点可以理解为被阉割的动态库。
App 中(App 和 Extension 的 Bundle 是共享的)所以苹果没有直接把这种Embedded Framework称作动态库而是叫Embedded Framework。
前面提到的静态库可以简单理解为一堆目标文件(.o/.obj)的打包体(并非二进制文件),而动态库可以简单理解为 一个没有main函数的可执行文件。
大学再讲编译原理的时候有两个非常重要的过程,编译和链接。编译可以理解为将源代码编译为目标文件,链接可以理解为将各种目标文件上加一些第三方库、并且和系统库链接起来为可执行文件。因为某个目标文件的符号(可以理解为变化、函数)可能来至其他目标文件,链接最为主要的就是决议符号的地址。
编译会生成目标文件,目标文件没有经过链接的过程,某些符号还没有调整过,Windows下的.obj文件,Linux下的.o文件,Unix的.out文件。
链接的过程可以简单描述如下:
假如主程序main.c 使用了 fun.c 模块的 foo函数,那么main.c在编译的过程,对于调用foo函数的指令,对于指令的目标地址暂时搁置;待到链接的时候,由链接器来填写foo函数的地址。
OC反射
通过类明获取类,通过方法名获取方法
所以说通过上面runtime的方式可以通过指针输出你想要的类当中的的全部属性,当然反过来也是可以实现的(这里对runtime不做过多的讲解,改天更新文章再对runtime进行分享
编译和链接的区别
将预处理生成的文件,经过词法分析、语法分析、语义分析以及优化后编译成若干个目标模块。可以理解为将高级语言翻译为计算机可以理解的二进制代码,即机器语言。
由链接程序将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的载入模型。链接主要解决模块间的相互引用问题。分为地址和空间分配,符号解析和重定位几个步骤。在编译阶段生成目标文件时,会暂时搁置那些外部引用,而这些外部引用就是在链接时进行确定的,链接器在链接时,会根据符号名称去相应模块中寻找对应符号。待符号确定之后,链接器会重写之前那些未确定的符号的地址,这个过程就是重定位。链接一般分为静态链接、载入时动态链接以及运行时动态链接三种。
OC和JS交互方式
注入 API 和 拦截 URL SCHEME
UIWebView 拦截 URL
WebViewJavascriptBridge。
只要调用
window.location.href = “openimagepicker://“
就会调用
(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
WebViewJavascriptBridge中OC调用JS采用的是WebView提供的JS执行方法;而JS调用OC采用的是URL拦截的方式,OC端通过识别特定的URL来区分是否需要拦截,并做相应的逻辑处理。
addScriptMessageHandler
evaluateJavaScript
JavaScriptCore
JSContext上下文,类似全局t对象,html的window对象一样
WKwebView,直接注入了JS方法名,不需要通过JavaScriptCore作为中间件
WKWebView 白屏问题: WKWebView 是一个多进程组件,Other Process 的内存占用会增加。WebContent Process 会 crash,从而出现白屏现象
缺点:承载当前webView的控制器无法正常释放
原因注意:这种方法很可能照成循环引用,所以在适当的时机要移除。
OC和JS是如何交互的
依赖注入
OC先声明一段JS代码,在第一次进入此webView页的时候注入到 webView中,之后webView上下文中就有了这些js函数。
注册声明 js 会被 oc 调用的方法存放在 js 环境的字典中;
oc 发起调用,生成一个message字典,三个参数(handlerName 方法名,data数据, callbackId 回调方法)
把message字典转成json字符串,处理字符串里面的\、\、\r、\n 等特殊字符。生成新的字符串并加上
WebViewJavascriptBridge._handleMessageFromObjC(‘messageJSON‘),形成一段字符串形式的js代码(既通过提前注入js中的函数_handleMessageFromObjC去处理 messageJSON 参数)。
模块化同层的依赖如何实现
通过引用的方式打出framework,所以需要在项目中同时使用
DNS过程 DNS劫持
编译过程
线程同步方法
死锁。如何避免
输入url后的事件流程
获取mac地址的过程
10亿数据查找目标,bitmap
浏览器渲染页面过程
设计一个StringBuffer
设计多线程下载一个1G文件
讲一讲hashmap 和hashtable 的区别
分享一个最值得分享的经历,觉得最有成就感的?过程中最有收获的点
什么是信号量
git
问这三个http版本有啥区别的区别
进程和线程切换的开销
切换虚拟地址空间
切换CPU上下文
切换内核栈
进程间通讯的四种方式
共享内存
信号
管道
消息队列
动态链接库和共享内存的区别在哪呢? 区别就在于:多个程序虽然可以共享同一个动态链接库中的相同代码,但每一个进程都为动态链接库使用的全部数据分配了自己的地址空间。而共享内存是代码和数据均被多个程序所共享。动态链接库只是实现了代码的复用,对于数据,各个程序要自己保存。共享内存用于进程间通信,主要用于数据…
DNS查询
从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。