iOS性能优化之内存管理:Analyze、Leaks、Allocations的使用和案例代码 -[转载]

最近研究代码质量检测问题,在网上找的相关资料咱是如下:

一. 一些相关概念

很多人应该比较了解这块内容了...可以权当复习复习...

1.内存空间的划分: 我们知道,一个进程占用的内存空间,包含5种不同的数据区:(1)BSS段:通常是存放未初始化的全局变量;(2)数据段:通常是存放已初始化的全局变量。(3)代码段:通常是存放程序执行代码。(4)堆:通常是用于存放进程运行中被动态分配的内存段,OC对象(所有继承自NSObject的对象)就存放在堆里。(5)栈:由编译器自动分配释放,存放函数的参数值,局部变量等值。

栈内存是系统来管理的,因此我们常说的内存管理,指的是堆内存的管理,也就是所有OC对象的创建和销毁的管理。伴随着iOS5的到来,苹果推出了ARC(自动引用计数)技术,此模式下编译器会自动在合适的地方插入retain、release、autorelease语句,也就是说编译器会自动生成内存管理的代码,解放了广大程序猿的双手,也基本上避免了内存泄露问题,但是呢...

2.内存泄露:百度百科给的定义是:"内存泄漏也称作‘存储渗漏‘,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏"。在iOS应用中的内存泄露,原因一般有循环引用、错用Strong/copy等。

二. Analyze—静态分析

顾名思义,静态分析不需要运行程序,就能检查到存在内存泄露的地方。

1. 使用方法:打开Xcode,command + shift + B;或者Xcode - Product - Analyze;

2. 常见的三种泄露情形:

(1)创建了一个对象,但是并没有使用。Xcode提示信息:Value Stored to ‘number‘ is never read。翻译一下:存储在‘number‘里的值从未被读取过。

(2)创建了一个(指针可变的)对象,且初始化了,但是初始化的值一直没读取过。Xcode提示信息:Value Stored to ‘str‘ during its initialization is never read

(3)调用了让某个对象引用计数加1的函数,但没有调用相应让其引用计数减1的函数。Xcode提示信息:Potential leak of an object stored into ‘subImageRef‘。 翻译一下:subImageRef对象的内存单元有潜在的泄露风险。

3. 贴上Demo代码:


**
 * 情 形 一:创建了一个对象,但是并没有使用。
 * 提示信息:Value Stored to ‘number‘ is never read
 * 翻译一下:存储在‘number‘里的值从未被读取过,
 */
- (void)leakOne {
    NSString *str1 = [NSString string];
    NSNumber *number;
    number = @(str1.length);
    /*
     说我们没有读取过它,那就读取一下,比如打开下面这句代码,对它发送class消息,就不再会有这个提示了。
     当然最好的方法还是将有关number的代码都删掉,因为,你只对number赋值,又不使用,那干嘛创建出来呢。
     这是一个比较常见和典型的错误,也很容易检查出来
     */
    // [number class];
}

/**
 * 情 形 二:创建了一个(指针可变的)对象,且初始化了,但是初始化的值一直没读取过。
 * 提示信息:Value Stored to ‘str‘ during its initialization is never read
 */
- (void)leakTwo {
    NSString *str = [NSString string]; // 创建并初始化str,此时已经有一个内存单元保存str初始化的值
    // NSString *str; // 这样就内存不泄露,因为str是可变的,只需要先声明就行。
    // printf("str前 = %p\n",str);
    str = @"ceshi";             // str被改变了,指向了"ceshi"所在的地址,指针改变了,但之前保存初始化值的内存空间还未释放,保存str初始化值的内存单元泄露了。
    // printf("str后 = %p\n",str); // 指针改变了
    [str class];

    // 再举两个例子,同理

    NSArray *arr = [NSArray array];
    // printf("arr前 = %p\n",arr);
    // NSArray *arr;            // 这样就内存不泄露
    arr = @[@"1",@"2"];
    // printf("arr后 = %p\n",arr); // 指针改变了
    [arr class];

    CGRect rect = self.view.frame;
    // CGRect rect = CGRectZero; // 这样就内存不泄露
    rect = CGRectMake(0, 0, 0, 0);
    NSLog(@"rect = %@",NSStringFromCGRect(rect));
}

/**
 * 情 形 三:调用了让某个对象引用计数加1的函数,但没有调用相应让其引用计数减1的函数。
 * 提示信息:Potential leak of an object stored into ‘subImageRef‘
 * 翻译一下:subImageRef对象的内存单元有潜在的泄露风险
 */
- (void)leakThree {
    CGRect rect = CGRectMake(0, 0, 50, 50);
    UIImage *image;
    CGImageRef subImageRef = CGImageCreateWithImageInRect(image.CGImage, rect); // subImageRef 引用计数 + 1;

    UIImage* smallImage = [UIImage imageWithCGImage:subImageRef];

    // 应该调用对应的函数,让subImageRef的引用计数减1,就不会泄露了
    // CGImageRelease(subImageRef);

    [smallImage class];
    UIGraphicsEndImageContext();
}

三. Leaks—内存泄露

Leaks是动态的内存泄露检查工具,需要一边运行程序,一边检测。

1.使用方法: 进入Xcode,command + control + i;或者Xcode - Xcode - Open Developer Tool - Instruments; 或者Xcode - Product - Profile。选择Leaks。

2.界面详情如下,这是运行时的界面

测试了好几个项目,发现用静态分析检查过的代码,内存泄露都比较少。有2个项目能点的按钮都点了,能进的页面都进的,Leaks也没检测到泄露。

四. Allocations—内存分配

Allocations是检测程序运行过程中的内存分配情况的,也需要同时运行着程序。1.打开方法:同上。2.界面情况如下:

截图二:

双击某一个方法,同样会跳转到代码里,会有每一句代码对应的内存分配情况,根据这些信息,可以对程序里不同代码的内存占用情况有一些认识,并进行针对性的优化。

五. 平时写代码的一些tip

说到底呢,instruments只是一组工具,帮助我们分析代码的工具,可能检查的出的内存问题和性能问题,肯定还是由代码造成的。养成良好的代码习惯,才是根本的解决方法。首先是避免出现静态分析里提到的三种常见内存泄露问题,我测试的好几个项目里,都有出现这个问题。

tip1:哪些情况会增加App的内存占用?「非完整版」

(1) 创建对象,定义变量。(2)调用一个函数或方法。

tip2:哪些情况会增加CPU的消耗?「搬运自YYKit的作者的博客(强烈推荐):ibireme

(1) 创建对象、调整对象属性、销毁对象。(2)布局计算和Autolayout。(3)文本的计算和渲染。(4)图片的解码和绘制。「用Time Profiler分析一下,可以更直观地感受到哪些操作比较耗时,使用方法同上。」

小结:做好cell等可复用对象的重用;可以只创建一次的对象,不要创建多次(比如页面的某个功能弹窗);用较少的对象和方法调用去实现功能;将耗时的操作放在子线程等可以对内存和性能做一些优化。

转载自:http://blog.csdn.net/zhaojian3513012/article/details/50998852

时间: 2024-10-11 00:47:24

iOS性能优化之内存管理:Analyze、Leaks、Allocations的使用和案例代码 -[转载]的相关文章

iOS性能优化技巧

iOS性能优化技巧 通过静态 Analyze 工具,以及运行时 Profile 工具分析性能瓶颈,并进行性能优化.结合本人在开发中遇到的问题,可以从以下几个方面进行性能优化. 一.view优化 1.不透明的View 设置为opaque. 2.根据实际情况重用.延迟加载或预加载View. 3.减少subviews数量,定制复杂cell使用drawRect.尽量使用drawRect而不是layoutSubView. 4.不直接调用drawRect. layoutSubviews方法.万不得已时可以用

iOS性能优化实战——Analyze静态分析

这边博客主要是学习 博主全栈工程狮 的<IOS性能调优系列:Analyze静态分析> 后的实践,最近公司的项目上架并没有做性能的调优,故此在此记录,以便以后使用,在此感谢博主 全栈工程狮  写的精彩博文 (引用)Analyze主要分析以下四种问题: 1.逻辑错误:访问空指针或未初始化的变量等: 2.内存管理错误:如内存泄漏等: 3.声明错误:从未使用过的变量: 4.Api调用错误:未包含使用的库和框架. 进过测试存在的问题: 1. 未用过的变量 2. 在一个类的实例方法中,没有对类进行init

iOS性能优化之Leaks动态分析

iOS性能优化之Leaks动态分析 Instruments-Leaks有很多跟踪模块可以动态分析和跟踪内存, CPU 和文件系统(因为是动态分析 所以必须运行才能打开). 具体使用 在XCode Open菜单下,点击Leaks 对App进行动态分析(快捷键CMD + i) 或者直接在工程中选择调试导航 在右侧点击Profile in instruments 检测图: Separate by Thread:按线程分开做分析,这样更容易揪出那些吃资源的问题线程.特别是对于主线程,它要处理和渲染所有的

[Android 性能优化系列]内存之基础篇--Android怎样管理内存

大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地址:http://developer.android.com/training/articles/memory.html 在接下来的一段时间里,我会每天翻译一部分关于性能提升的Android官方文档给大家 以下是本次的正文: ################ 随机訪问存储器(Ram) 无论在哪种软件

IOS性能调优系列:Analyze静态分析

目前关于IOS性能优化的教程较少,决定写一个<IOS性能调优系列>,主要关注与内存泄漏.性能优化.流量和电量分析几个方面. XCode已经提供了非常强大的性能调优工具,结合几个第三方工具和一些技巧,进行性能优化非常简单. 第一篇先写写最简单的,Analyze静态分析. 相信IOS开发者在App进行Build或Archive时,会产生很多编译警告,这些警告是编译时产生的,静态分析的过程也类似,在XCode Product菜单下,点击Analyze对App进行静态分析. Analyze主要分析以下

IOS 性能优化的建议和技巧

IOS 性能优化的建议和技巧 本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以在Twitter上关注@marcelofabri_. 性能对 iOS 应用的开发尤其重要,如果你的应用失去反应或者很慢,失望的用户会把他们的失望写满App Store的评论.然而由于iOS设备的限制,有时搞好性能是一件难事.开发过程中你会有很多需要注意的事项,你也很容易

【腾讯Bugly干货分享】微信读书iOS性能优化

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/578c93ca9644bd524bfcabe8 "8小时内拼工作,8小时外拼成长"这是大家共同的理想.除了每天忙于工作外,我们都希望能更多地区吸收领域内的新知识与新技能,从而走向人生巅峰. Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师.每周都会举行嘉宾分享,话题讨论等活动. 上一期我们邀请了腾讯SNG工程师&qu

iOS性能优化之“优化总体原则”(性能优化很重要,为什么你们都没有用?)

笔者由于在iOS开发过程中做过一些优化的工作,对iOS性能优化有一些粗浅的认识,一直想把自己这些经验,简单总结一下. 作为整个系列的第一篇,我打算针对iOS的优化中的一些总体原则做一些总结.因为我觉得无论列表流畅度优化也好.启动时间优化也好还是说其他方面的优化,都有一些共性的原则,只有掌握了这些总体性的原则,才能够更好的做优化,给我们具体的优化任务指明方向,让我们少绕弯路.后面如果时间允许,我可能会写一些关于列表流畅度.启动时间和内存优化等方面的文章. 作为一个开发者,有一个学习的氛围跟一个交流

iOS性能优化:Instruments使用实战

iOS性能优化:Instruments使用实战 最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有用的用户使用Guide,当然如果不习惯官方英文可以在这里找到中文本翻译版本PDF参阅.Instruments 确实是一个很强大的工具,用它来收集关于一个或多个系统进程的性能和行为的数据极为方便,并能及时跟踪随着时间产生的数据.还可以广泛收集不同类型的数