内存泄露问题是每个app都必须关注的问题,关系到线上的稳定性和性能。内存泄露会导致:
由于内存资源不足发生难以排查的线上bug
由于被泄露对象的存在导致的一些业务bug,比如泄露的对象仍在接受全局通知
性能问题,导致用户使用app时越来越卡
内存泄露发现分成静态扫描和运行时检测,本文主要讲运行时检测。
静态扫描
静态扫描的工具:
xcode analyzer
OCLint
Infer
运行时动态检测
由于静态扫描不能发现所有的内存泄露问题,所以运动时检测是必不可少的。
Allocation
Xcode的Allocation可以通过比较不同时间段的对象,分析出是否发生了内存泄露。但是前提是每个页面的命名要符合规范,比如宝贝详情页的所有对象都是应用前缀+宝贝详情页面前缀+具体对象名,这样才退出页面的时候才能知道相应的对象是否被释放了,因为stack最底部的页面的对象常驻在内存中。
Allocation通过和Monkey配合,在回归测试的时候,自动运行并通过计算内存占用率可以判断出新的开发版本是否发生了内存泄露,但是无法知道具体是哪个对象没有释放,只能是全局的判断。
MLLeaksFinder
非常实用的内存泄露检查工具,主要原理是UINavigationController在pop页面的时候,可以预测出被pop的页面将被释放,所以在一段时间后(3s)对这个对象进行断言判断,如果没有被释放的话程序就会中断,还可以扫描view hierarchy,或者自定义扫描需要的对象。
相比Allocation,最大的好处就是
及时发现正在开发的页面是否发生了内存泄露,及时排查,而不是在回归测试的时候才发现
如果应用中的每个页面都有相应配置的URL scheme的话,那么把所有页面的url写在配置文件中,在回归测试的时候,代码里自动push每个url的页面,可以做到完整地回归所有页面,又免去了Allocation手动点击各个页面的繁琐。
如果嫌MLLeaksFinder代码太多,可以自己实现一个精简版的,原理比较简单,代码写起来很少。
如何排查
上述的各种方法发现了内存泄露后,排查并解决才是最关键的一步。根据泄露的对象,重点排查block和两个以上对象循环引用的情况。
如果是ViewController发生内存泄露,重点查看ViewController里面的block是否忘记声明weak了,因为ViewController被其他对象持有的情况不常见。如果是用RAC的话,记得weakly和strongly要成对出现,否则会发生内存泄露。
最常发生的是View的内存泄露问题,首先查看是发生内存泄露的view之间是否有delegate的关系,如果有的话看看delegate属性有没有声明weak
由于service或者读取缓存等异步操作引起的内存泄露问题
总结
内存泄露问题主要还是靠编码时的规范,静态扫描能解决一部分问题,动态扫描是最后的保证。而排查内存泄露经验很重要。iOS加密也不能忽视,要对重要的数据进行加密,根据重要程度选择安全性可靠的方式。几维安全编译器基于LLVM编译器中间层实现,加密代码与业务代码紧密结合,有效阻挡逆向分析,加密过程不依赖于特定系统环境,无兼容性问题。
欢迎iOS开发者关注几维安全iOS加密(http://www.kiwisec.com/product/compiler.shtml)产品。几维安全依托自己的移动防御能力想做为开发者服务的安全产品,帮助中小企业解决移动应用被破解的问题,为广大中小企业提供既轻松又简单的移动安全产品和服务。
分享到:
相关推荐
在iOS开发中,RSA是一种广泛使用的非对称加密算法,主要应用于数据的加密和数字签名。RSA的安全性基于大整数因子分解的困难性,它包括一对密钥:公钥和私钥。公钥用于加密,私钥用于解密。在处理大量数据时,由于RSA...
本DEMO是针对iOS平台实现DES加密的一个实例,它可以帮助开发者理解如何在iOS应用中集成并使用DES加密技术。 DES算法起源于1970年代,由IBM开发,后来被美国国家标准局采纳为标准。它基于64位的数据块和56位的密钥...
**AES加密概述** AES,全称为“高级加密标准”(Advanced Encryption Standard),是目前广泛使用的对称加密算法,尤其...通过以上介绍,你应该对AES加密在iOS上的实现有了深入的理解,可以着手编写安全的加密代码了。
在iOS开发中,RSA加密是一种广泛使用的非对称加密算法,尤其在保护敏感数据和确保通信安全方面。本文将深入探讨如何在iOS中利用公钥文件进行RSA加密。首先,让我们理解RSA加密的基本原理。 RSA(Rivest–Shamir–...
iOS加密工具主要负责对应用程序的数据进行保护,防止未经授权的访问和泄露。以下是对“iOS加密工具”这一主题的详细阐述: 一、加密概述 加密是一种将明文数据转换为难以理解的形式(密文)的过程,以保护数据的...
在iOS应用开发中,内存管理和软件调试是两个至关重要的环节,它们直接影响到应用程序的性能、稳定性和用户体验。本文将深入探讨这两个主题,并提供一些实用的技巧和方法。 首先,我们来谈谈iOS内存管理。iOS系统...
AES加密算法有多种工作模式,如ECB(Electronic Codebook)、CBC(Cipher Block Chaining)、CFB(Cipher Feedback)等。ECB是最基础的模式,它将明文分为固定大小的块进行独立加密,但因为其模式简单,可能导致相同...
4. 平台间兼容性处理:确保JAVA和iOS加密后的结果一致,以便于数据交换。 在实际应用中,需要注意以下几点: - DES的安全性相对较弱,因为56位的密钥长度容易受到现代计算机的攻击。为了增强安全性,通常会使用...
RSA非对称加密是一种广泛应用于网络安全的加密技术,尤其在移动应用如iOS开发中,它在数据保护、身份验证和安全通信中扮演着重要角色。本文将深入探讨如何在iOS平台上,通过Objective-C语言轻松实现RSA非对称加密。 ...
以下是对iOS开发中MD5加密的详细讲解: 1. **MD5概述**: - MD5是由美国计算机科学家罗纳德·李维斯特设计的,它可以生成一个128位(16字节)的散列值,通常以32位的十六进制数字表示,即32个字符。 - 由于MD5...
本文将深入探讨iOS用户信息加密、Sskeychain框架以及钥匙串访问的相关知识。 首先,我们来理解一下什么是钥匙串(Keychain)。在iOS系统中,钥匙串是用于存储用户账户、密码、证书和其他敏感信息的安全存储区。与...
XXTEA(Extreme eXtended TEA,极度扩展的TEA)是一种对称加密算法,由David Wheeler和Roger Needham在1994年提出,...理解并掌握XXTEA的工作原理和Objective-C的实现方式,有助于提升iOS应用的安全性,防止数据泄露。
文件"js aes.txt"可能是JavaScript实现AES加密的示例代码,而"AES加密 – iOS与Java的同步实现"可能是介绍如何在iOS和Java之间实现同步加密的教程或代码示例。通过学习这些内容,开发者可以掌握如何在不同平台上实现...
- 服务器接收到加密数据后,使用私钥(这是服务器端保有的,不会泄露给客户端)进行解密,恢复原始信息。 在实际应用中,为了提高安全性,通常会结合其他机制,如HMAC(Hash-based Message Authentication Code)...
同时,确保在数据库操作的整个生命周期中正确管理内存和数据库连接,以防止内存泄漏和安全漏洞。 总结一下,iOS应用中使用SQLCipher进行数据库加密的关键步骤包括:下载SQLCipher源码、添加到项目、配置项目设置、...
在iOS中,你可以通过这个类方便地对字符串、文件或自定义数据结构进行AES加密和解密操作。使用时,先创建AESEncryption对象,设置密钥,然后调用加密或解密方法。需要注意的是,密钥管理非常重要,必须确保密钥的...
在iOS中,你可以使用`SecTransformCreateEncrypt`创建加密变换,并设置公钥作为输入参数。然后,将明文数据转换为字节序列,通过变换进行加密。 3. **私钥解密**:接收方收到加密数据后,使用自己的私钥进行解密。...
理解内存管理原理,避免循环引用和内存泄漏至关重要。 三、网络编程 iOS应用经常需要与服务器交互,因此网络编程知识必不可少。可能会涉及URLSession、AFNetworking等网络库的使用,以及HTTP/HTTPS协议、JSON解析等...
在iOS开发中,OpenSSL是一个重要的加密库,用于实现各种安全协议,如SSL/TLS以及加密算法,如RSA、DSA等。本资源提供的是针对iPhone 15.5.sdk版本编译完成的OpenSSL库,这使得开发者能够在iOS平台上集成OpenSSL的...
在iOS开发中,为了保护应用程序的数据安全,对plist文件进行加密是常见的做法。Plist(Property List)文件是苹果系统中用于存储配置信息或轻量级数据的文件,通常以XML或二进制格式存在。当这些文件包含敏感信息时...