您的位置:首页 > 理论基础 > 计算机网络

内存优化和网络安全以及HTTPS

2016-02-23 13:06 337 查看
在开发过程中,内存管理有利于应用的优化,而网络安全则是保护应用不被攻击和侵犯。这两者担当者一个优秀应用的重要角色。以下知识点都是我搜集加补充的,有什么不对的或者可以补充的,希望大牛们指导。

内存优化:

其实在某我的很多博客中,我都提到过内存优化的一些方法,现在再系统的总结一下。

1、最简单的就是使用ARC

2、使用复用队列

3、避免过于庞大的Xib

4、避免主线程阻塞

5、在用imageView加载前调整图片大小:在运行中缩放图片是很耗费资源的,如果是远程下载的话可以开启子线程缩放一次在加载到imageView;

6、用gzip压缩

7、当需要时再创建并展示(我平时习惯用视图透明度为0或者1使其隐藏或者显示,实际这是耗资源的)

8、cache缓存策略

9、权衡使用渲染方法

10、重用大开销对象

11、避免反复处理数据(如最好直接从服务器取array结构的数据以避免额外的中间数据结构改变)。

12、选择正确的数据解析格式(通常解析JSON会比XML更快一些)

13、减少使用Web特性

14、设定shadow path(我经常设置阴影,现在才知道添加view.layer.shadowPath=[[UIBezierPath bezierPathWithRect:view.bounds]CGPath];这样就不用每次都计算如何渲染,它使用一个预先计算好的路径)

15、选择是否缓存图片

imageNamed加载并缓存,imageWithContentOfFile仅加载;如果是加载大的图片并且一次性使用没必要缓存。

16、避免日期时间格式转换(尽量用C语言的)

17、优化TableView

这是一个大的内容,如果TableView优化的好的话,对开发帮助很大。

(1)正确使用reuseIdentifier来重用cells

(2)尽量使所有的view opaque,包括cell自身

(3)避免渐变,图片缩放

(4)缓存行高,预设行高

(5)如果cell内实现的内容来自web,使用异步加载,缓存请求结果

(6)尽量不使用cellForRowAtIndexPath,如果需要请缓存

(7)减少subviews数量

(8)使用正确的数据结构来存储数据

比如:

NSUserDefaults:适用于小数据;

XML,JSON或者plist:网络数据或者嵌套数据

NSCoding存放:需读写文件,较麻烦

CoreData:特定的查询语句就能加载,apple一般建议使用。

SQLite:可以用FMDB这个库更简单的应用,与CoreData相比更加底层。

(9)预设行高,头视图,尾视图高度

18、处理1000张图片的内存优化

在加载大量的图片时,还是会出现问题。其根本原因就是autorelease惹的祸,autorelease自动释放内存,并不会立即把内存释放掉,而是要等到下一个事件周期才会释放掉。问题是一些资源我们不得不使用autorelease类型,比如作为函数的返回值,而且系统api及项目是的大部分也都是这么做的,如果全都依靠我们手动释放很容易造成内存泄漏。

01
for
(
int
i
= 0; i <= 1000; i ++) {
02
03
//创建一个自动释放池
04
05
 
NSAutoreleasePool
*pool = [NSAutoreleasePool
new
];
06
07
 
NSString
*filePath = [[NSBundle mainBundle] pathForResource:@
"test"
ofType:@
"PNG"
];
08
09
 
UIImage
*image = [[UIImage alloc] initWithContentsOfFile:filePath];
10
11
 
UIImage
*image2 = [image imageByScalingAndCroppingForSize:CGSizeMake(480, 320)];
12
13
 
[image
release];
14
15
//将自动释放池内存释放,它会同时释放掉上面代码中产生的临时变量image2
16
17
 
[pool
drain];
18
19
}
19、不停的往UIView,特别是UIScrollView上add相同SubView,一定要记得清除之前的SubView,并且在dealloc函数中执行该方法。

20、在调用drawRect方法并在里面添加代码时要先判断需要创建的对象是否存在,避免摸不清楚调用时机而重复创建。

21、某大神:属性对象不要用self.来alloc它,如self.myarr = [[NSArray alloc]init];不好。应该NSArray * tmpArr = [[NSArray alloc]init]; self.myarr = tmpArr; [tmpArr release];但是查阅众多资料都说这两种写法没差别,我的理解是在ARC下两种写法没有差别,MRC下可能有差别吧,有大神知道的请指教。

最后说一下xcode自带的一些查内存的工具

1、首先使用Analyze build查看归类当中的memory警告。这个一般能发现局部变量中忘记release,或者被中途打断的release。

2、然后就是直接使用Instruments中的leak监测。申请了内存,然后已经没有指向这块内存的指针存在,可以认为是leak了,这个检测一般是检测这个状态。

3、通过Instruments中allocation的mark heap。进行不断的重复操作,在每次场景结束后,标记内存。假如操作场景没有泄露,内存增加应该是0,这个检测是检测标点之间有哪些对象增加。另外,需要多mark几次才会准确,不要mark两次看到内存增加就去找问题。

Instruments中都是可以看到其中存在什么对象,调用历史,调用堆栈。这时候大致确定在那个类当中的那个对象泄露了。

网络安全:

1、关于网络安全,仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题的。我就曾经用过“青花瓷”(Charles)软件设置代理服务器,拦截查看过手机的请求数据。因此我在开发中比较重要的数据,我都会加密后再提交。常见的加密算法有:MD5/SHA/DES/3DES/RC2和RC4/RSA/IDEA/DSA/AES.

这里简要的说一下MD5加密吧,现在的MD5已经不再绝对安全了,所以可以对MD5稍作改进,以增加解密的难度。

(1)加盐(Salt):在明文的固定位置插入随机串,然后再进行MD5加密。

(2)先加密,后乱序:先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序。

2、通信协议被轻易破解。可以选择ProtoBuf(Google提供的一个开源数据交换格式,其最大的特点是基于二进制,因此比传统的JSON格式要短小的多)之类的二进制通信协议或者自己实现通信协议,对于传输的内容进行一定程度的加密,以增加黑客破解协议的难度。

3、验证应用内支付凭证

4、本地数据安全,保存在本地的重要数据,我们应该加密存储或者将其保存在keyChain中。

5、源代码安全,网络上有一些工具可以对oc带代码进行反汇编,如IDA。。

因此有许多应用关键的逻辑是用纯C语言来实现的,这样不仅能保证通信协议的安全,也可以是对平台公用一套底层通信代码,达到复用的目的。

摘自:作者唐巧:资深iOS开发者,曾开发有道云笔记和猿题库,维护了iOS开发的博客(http://blog.devtang.com)和微信公共账号(iOSDevTips),微博:@唐巧_boy

6、HTTPS

iOS9之后开始使用更为安全的https协议,其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,从此保证传输数据的安全;而对于接收端,在SSL/TSL将接收的数收的数据包解密之后,将数据传给HTTP协议层,就是普通的HTTP数据。HTTP和SSL/TSL都处于OSI模型的应用层。从HTTP切换到HTTPS时一个非常简单的过程。不过这里要岔开一个话题,谈谈SSL/TLS协议运行机制;

互联网的通信安全,建立在SSL/TLS协议之上。

1、不使用SSL/TLS的HTTP通信,就是不加密的通信,所有信息明文传播,带来三大风险。

(1)窃听风险(eavesdropping):第三方可以获知通信内容。

(2)篡改风险(tampering):第三方可以修改通信内容。

(3)冒充风险(pretending):第三方可以冒充他人身份参与通信。

SSL/TLS协议是为了解决这三大风险而设计的,希望达到:

(1)所有信息都是加密传播,第三方无法窃听

(2)具体校验机制,一旦被篡改,通信双方会立刻发现。

(3)配备身份证书,防止身份被冒充。

SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

如何实现HTTPS呢?就拿我们最常用的AFNetWorking来说吧

相关的Api在Security Framework中,

1、先获取需要验证的信任对象

2、使用系统默认验证方式验证信任对象

3、使用信任对象生成一份凭证。

4、本地导入证书,验证Trust Object与导入证书是否匹配。

5、假如验证失败,取消此次验证流程,拒绝连接请求。

AFNetworking上配置对HTTPS的支持非常简单:

这就是AFNetworking的支持HTTPS的主要配置说明,AFHTTPSessionManager与之基本一致,就不重复了。
HTTPS和HTTP区别

HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份验证的网络协议。

HTTPS协议需要用到ca申请证书,一般免费证书很少,需要交费。

HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。

HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443.

HTTP的连接很简单,是无状态的。HTTPS协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议。

虽然HTTP在使用上简单,但是对于网络飞速发展的今天,安全才是我们更应该去考虑的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: