1、客户端安全性的处理的方式?
我们可以从三个方面来想,一个是网络数据传输的安全性问题,就比如说我们登录的时候都是用POST请求去登录
我们发送给服务器的账号和密码肯定不可能是用明文的,肯定需要通过加密去传输的,以及其实账号密码在有些数据库
中存储的也是经过加密之后的结果,其实就是在网络数据传输中一些敏感数据都是不能去明文发送的,不然就有可能会
泄漏用户隐私,就比如说账号啊密码啊,买了什么东西啊,花了多少钱啊,这些都是不能明文发送的。
还有一个是本地的文件存储,就比如说我们想要在客户端中记住密码,那么我们肯定需要通过加密去把密码保存在本地
还有就是一些游戏的存档也可能是放在本地中的,我们肯定也要进行加密,不然用户很有可能会有办法进行修改。
另外一个就是源代码,我们应该知道,我们的代码最终都是被编译成了一个可执行的文件,开发者将ipa包上传app Store审核
应用上线之后,我们下载,其实也是可以有办法拿到这个应用程序的ipa包的,而且现在还有反编译工具,也就是说可以把
你的这个可执行文件再次转换成代码,这样就会导致你的代码泄漏的问题。虽然说现在上架至App Store的app,被apple加密,
但还是有可能会被反编译的。所以我们为了别人读不懂我们的代码,我们可以去进行混淆操作,可以手动混淆,当然也可以
借助工具来混淆,但是手动混淆就是自己去改类的方法和名字,这样肯定不好,这样自己都搞不懂自己写的是什么了。
还有就是比如说现在协议的问题,一些公司都有自定义的协议。这样别人就不懂,不然的话一些协议的标准别人都懂的
就可以根据那些标准太推测出你要传什么参数过去了。
2、有些图片加载的比较慢,我们应该怎么去处理,怎么去优化程序的性能?
1、图片下载要放在异步线程,图片下载的时候最好放占位图片,现在QQ啊微信啊等等都是有的,就是为了给用户更好的体验
2、如果图片较大,我们应该去考虑多线程断点下载,就比如说我们可以这么做
3、如何自己去封装框架能让别人更好的去使用
这个时候我们应该让自己提供给外界的接口要比较的好用,就比如说我们有一个框架是可以去发送HTTP请求的,那我们去
提供的接口肯定是要有GET请求和POST等等的接口,以及这些接口中传入的参数也要齐全。不然实用性就不高。还有就是
我们需要注意的是应该能让别人在使用我们框架的时候,能根据类名、方法名就可以去猜出接口的作用是什么。我们提供的
接口也应该保证比较简单,这样别人调用起来比较简单,还有就是在别人使用你的框架的时候应该尽量的,不要再让别人去导入
其他框架了。
4、是否可以把耗时的操作放在NSNotificationCenter?
这个时候我们需要注意了,我们的通知在哪个线程中发的就会在哪个线程执行,也就是说如果不是主线程
发的通知,我们可以去执行耗时的操作,在子线程中发送的通知,对应的执行方法也是在子线程中执行,但是如果是主线程发的通知就不用去执行比较耗时的操作。
5、AFN和ASI的区别就是在于AFN是基于NSURLSession的,而ASI是基于底层的CFNetwork框架的,所以ASI的性能会更好。
6、Runloop的简单介绍
Runloop 接收的输入事件来自两种不同的源:输入源(intput source)和定时源(timer source)
Runloop可以使程序保持不断的运行(一个死循环,使app不断运行)可以处理App中的各种事件(触摸、定时器、Selector)
可以节省CPU资源、提高程序的性能,就是检测的时候检测,不检测的时候就休息。Runloop中的输入源是处理其他线程或者程序的消息,
timeSource是处理同步消息的,比如说处理一些有一定时间间隔发生的消息
7、在即时通讯中大数据的处理的方式
我们应该都用过一些聊天软件,在我们使用的聊天软件中会发送语音和文件,这个语音和文件是很大的,如果我们去走TCP/IP协议传输肯定是不可能的
因为使用TCP/IP的话传输速度太慢,所以这个时候我们可以有一个文件服务器,专门放文件服务器,这样我们在传输文件的时候可以把put请求把文件先
上传到文件服务器,然后上传成功之后再去把URL的字符串发给另一个用户,然后它再去下载。
8、如果再网络的数据处理中,发现有些地方比较卡,应该怎么解决?
首先我们应该去检查网络操作有没有被放在主线程中,如果放在主线程那么我们就要去把他放到子线程中,还有就是看看发送了多个请求
子线程的数量太多,因为线程是非常消耗资源的,还有就是要去看自己应用占据内存是不是越多越多,如果手机内存不够了就会很卡。这个
时候我们可以去清除不显示的数据,我们还可以在收到内存警告的方法中再去做相应的操作
9、Sqlite数据库锁死的原因
其中一个就是我们在短时间内执行了大量的SQL语句,网上有这个解释也就是说导致一部分SQL还未处理或者正在处理,另外一部分已经在后面排队等待了,这个时候,也就发生了阻塞,如果说短时间内出现高并发,持续个几秒或最多几分钟的情况,队列里面的SQL排队一个个处理完,sqlite负载自然也会降下来,但如果持续的时间比较长,负载下不去,内存连接CPU都会爆满,则会导致sqlite挂掉。还有就是如果多线程访问的时候,数据库也会被锁定,就比如说你线程1在访问的时候,会加一个锁,当你线程2再去访问的时候就会提示被锁定,因为有些的锁是互斥的,当申请不到锁时就会返回这个错误,我们可以去设置下数据库被锁定的处理函数 sqlite3_busy_handler(sqlite3 *, int (*)(void *, int), void *),第一个参数就是sqlite3这个结构体的指针,这个函数的第三个参数是会给我们第二个参数所定义的回调函数的第一个参数,当出现数据库被锁时,sqlite会调用该函数,如果回调函数返回0时,将不再尝试再次访问数据库而返回SQLITE_BUSY,如果回调函数返回非0, 将会不断尝试操作数据库。
然后再去设定锁定时的等待的时间也就是int sqlite3_busy_timeout(sqlite3*,int s)这个的意思其实就是比如说线程1在访问数据了,然后这个等待时间就是去设置等待多少秒之后,这个时候如果线程1在这个时候段内处理好事情了,就不会导致你线程2无法访问数据库了。
10、什么是isa指针
每一个对象内部都有一个isa指针,对象的isa指针就指向它的真实类型,就比如说一个Person *person对象,它的isa指针就指向它的Person类,通过这个指针就能去知道自己的类,就能够去知道以后要去调方法要去调哪个方法