面试分了两个部分:
第一部分是业务方面的,介绍自己做过些什么,用了哪些东西。
第二部分:
1.GCD的用法;
2.SDWebImage 介绍是怎样实现图片缓存的;
3.你对加密算法有什么了解,从对称加密和非对称加密两方面来说;
4.POST和GET的区别:
5.数据结构的三大范式是什么;
6.TCP的五层结构了三次握手;
7.TCP协议的网络层和传输层有什么区别;
8.UIWebView;
9.strong,weak有什么区别;
10java的垃圾回收机制;
11.数据库的模糊查询是怎样实现的;
12.哪些数据是放在堆上的,哪些是放在栈上的;
算法:
1.判断链表是否有环;
2.两个数组查有多少中重复的;
个人答案:
1.这个问题问的很宽泛,个人理解就是说说基本的用法,举例子说一下自己用到多线程的情况和调用的方法就可以了;
2.这个就比较多了,建议看一下这个帖子(http://blog.cocoachina.com/article/70531);
3.这个是在问到用户登录时,向服务器发送数据是采用什么加密方式后问的,然而我并不了解加密。
4.POST和GET是http中最常用的两种方法,GET方法——从指定资源请求数据,POST方法——向指定资源提交要被处理的数据。
①GET请求可以被缓存,POST请求不可以被缓存;
②GET请求可保留在浏览器的历史记录中,POST请求不会保留;
③GET请求可以被收藏为书签,POST请求不可以;
④GET请求传送的参数有长度限制,POST请求没有;
⑤GET请求只能进行url编码,而POST支持多种编码方式;
⑥GET请求只用于取回数据,且不应该用于处理敏感数据;
⑦GET参数通过URL传递,POST放在Request body中;
⑧GET在浏览器回退时是无害的,而POST会再次提交请求;
⑨对参数的数据类型,GET只接受ASCII字符,而POST对此没有限制;
GET/POST本质上都是TCP链接。GET和POST能做的事情是一样的。区别在于GET产生一个TCP数据包;而POST会产生两个TCP数据包。(对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据))
参考文档:
http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
https://www.cnblogs.com/logsharing/p/8448446.html
5.已经太久没用,问的时候都忘得差不多了,赶快搜索一下,加深一下记忆:
第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
6.这个就是个经常问的问题了,面试官还多问了一下,为什么不能是两次,为什么不能是4次:
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
7.不知道怎么评价这个问题。
网络层负责ip数据报的产生以及ip数据包在逻辑网络上的路由转发。
传输层提供端到端通信服务层次,提供可靠及非可靠连接。
8.面试官问我对这个东西了解多少,用过没有。我只用过一次,就是在扫描二维码以后,获取到地址,用webview打开。所以也不太清楚面试官具体要问什么。
9.weak和strong用来修饰变量,表示这个变量是一个强引用还是一个弱引用。我们开辟一个内存并初始化后(alloc->init),赋值给一个weak变量后,这块内存会被释放掉,如果是分配给strong变量,就会等到这个变量的生命周期结束后这块内存才能够被释放。
用weak来避免循环引用(用weak来修饰delegate);典型例子是delegate模式,你的ViewController通过strong指针(self.view)拥有一个UITableView, UITableView的dataSource和delegate都是weak指针,指向你的ViewController。
只有一种情况你需要使用weak(默认是strong),就是为了避免retain cycles(就是父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release)
附加:copy与retain:
copy一般用来修饰NSString和block;
copy其实是建立了一个相同的对象,而retain不是;
copy是内容拷贝,retain是指针拷贝;
copy是内容的拷贝 ,对于像NSString,的确是这样,但是如果copy的是一个NSArray呢?这时只是copy了指向array中相对应元素的指针.这便是所谓的"浅复制".
copy的情况:NSString *newPt = [pt copy];
此时会在堆上重新开辟一段内存存放@"abc" 比如0X1122 内容为@"abc 同时会在栈上为newPt分配空间 比如地址:0Xaacc 内容为0X1122 因此retainCount增加1供newPt来管理0X1122这段内存;
10.我也不知道我一个面试iOS的为什么要问我关于java的垃圾回收机制。
11.模糊查询我还真的不会,平常都是直接发到发给服务器就好了,突然问我怎么实现模糊查询第一反应就是直接把数据发给服务器等结果啊。
模糊查询:SELECT 字段 FROM 表 WHERE 某字段 Like 条件
可以用%(一个或多个)、_(单个字符),来表示模糊查询的数据,example:
查询姓名中包含三的:SELECT * FROM [user] WHERE u_name LIKE ‘%三%’;
查询姓名中间字为三的(姓名三个字):SELECT * FROM [user] WHERE u_name LIKE ‘三’;
查询张三、李三或王三:SELECT * FROM [user] WHERE u_name LIKE '[张李王]三’;
参考文章:https://www.cnblogs.com/to-creat/p/6515256.html
栈:由系统自动分配,速度较快,不会产生内存碎片,
堆:是由alloc分配的内存,速度比较慢,而且容易产生内存碎片,不过用起来最方便。
网友评论