内存分析

静态分析(Analyze)

不运行程序, 直接检测代码中是否有潜在的内存问题(不一定百分百准确, 仅仅是提供建议)

结合实际情况来分析, 是否真的有内存问题

动态分析(Profile == Instruments)

1> 运行程序, 通过使用app, 查看内存的分配情况(Allocations)

* 可以查看做出了某个操作后(比如点击了某个按钮\显示了某个控制器), 内存是否有暴增的情况(突然变化)

2> 运行程序, 通过使用app, 查看是否有内存泄漏(Leaks)

* 红色区域代表内存泄漏出现的地方

经典代码:

- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGMutablePathRef path = CGPathCreateMutable();

    CGPathAddEllipseInRect(path, NULL, rect);

    CGContextAddPath(context, path);

    [[UIColor redColor] set];

    // 如果缺少下面这两句,将会导致内存泄露,有Create,必须有Release
CGPathRelease(path);
//CFRelease(path); CGContextDrawPath(context, kCGPathFill);
}

内存使用注意

1.加载小图片\使用频率比较高的图片

1> 利用imageNamed:方法加载过的图片, 永远有缓存, 这个缓存是由系统管理的, 无法通过代码销毁缓存

2.加载大图片\使用频率比较低的图片(一次性的图片, 比如版本新特性的图片)

1> 利用initWithContentsOfFile:\imageWithContentsOfFile:\imageWithData:等方法加载过的图片, 没有缓存, 只要用完了, 就会自动销毁

2> 基本上, 除imageNamed:方法以外, 其他加载图片的方式, 都没有缓存

/*
imageName和imageWithContentOfFile imageName:加载图片
1.当对象销毁,图片对象不会随着一起销毁
2.相同的图片只会加载一份到内存中,如果同时使用,使用同一个对象即可 imageWithContentOfFile:加载图片
1.当对象销毁的时候,图形对象会随着一起销毁
2.相同的图片会多次加载到内存中,如果同时使用图片,使用的是不同的对象 总结:
imageName:如果一些图片在多个界面都会使用,并且图片较小,使用频率高.(图标/小的背景图)
imageWithContentOfFile:只在一个地方使用,并且图片较大,使用频率不高.(版本新特性/相册)
*/ #import "TwoViewController.h" @interface TwoViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView1; @end @implementation TwoViewController - (void)viewDidLoad {
[super viewDidLoad]; // imageWithContentOfFile:加载图片方式
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"2.png" ofType:nil];
self.imageView.image = [UIImage imageWithContentsOfFile:imagePath];
self.imageView1.image = [UIImage imageWithContentsOfFile:imagePath]; /*
self.imageView.image = [UIImage imageNamed:@"2"];
self.imageView1.image = [UIImage imageNamed:@"2"];
*/
} @end

2个专业术语

内存泄漏

1> 该释放的对象, 没有被释放(已经不再使用的对象, 没有被释放)

内存溢出(Out Of Memory)

1> 内存不够用了

2> 数据长度比较小的数据类型 存储了 数据长度比较大的数据

图片在沙盒中的存在形式

1.如果项目的Deployment Target <= 6.x (不支持图片压缩)

1> 所有图片直接暴露在沙盒的资源包(main Bundle), 不会压缩到Assets.car文件

2.如果项目的Deployment Target >= 7.x (支持图片压缩)

1> 放在Images.xcassets里面的所有图片会压缩到Assets.car文件, 不会直接暴露在沙盒的资源包(main Bundle)

2> 没有放在Images.xcassets里面的所有图片会直接暴露在沙盒的资源包(main Bundle), 不会压缩到Assets.car文件

3.总结

1> 会压缩到Assets.car文件, 没有直接暴露在沙盒的资源包(main Bundle)

* 条件 : "Deployment Target >= 7.x" 并且是 "放在Images.xcassets里面的所有图片"

* 影响 : 无法得到图片的全路径, 只能通过图片名(imageNamed:方法)来加载图片, 永远会有缓存

2> 不会压缩到Assets.car文件, 直接暴露在沙盒的资源包(main Bundle)

* 条件 : 除1> 以外的所有情况

* 影响 : 可以得到图片的全路径, 可以通过全路径(imageWithContentsOfFile:方法)来加载图片, 不会有缓存

4.结论

1> 小图片\使用频率比较高的图片

* 放在Images.xcassets里面

2> 大图片\使用频率比较低的图片(一次性的图片, 比如版本新特性的图片)

* 不要放在Images.xcassets里面

设备信息相关的开发(非私有API, 底层API)

1.设备的型号

2.设备的CPU型号\使用情况

3.设备的内存容量\使用情况

4.设备的硬盘容量\使用情况

5.......

6.推荐的第三方库

uidevice-extension

* 地址 : https://github.com/erica/uidevice-extension

* 实现思路 : 利用分类给UIDevice进行了扩展

* 使用难易度 : 非常简单

如何让程序尽量减少内存泄漏

1.非ARC

* Foundation对象(OC对象) : 只要方法中包含了alloc\new\copy\mutableCopy\retain等关键字, 那么这些方法产生的对象, 就必须在不再使用的时候调用1次release或者1次autorelease

* CoreFoundation对象(C对象) : 只要函数中包含了create\new\copy\retain等关键字, 那么这些方法产生的对象, 就必须在不再使用的时候调用1次CFRelease或者其他release函数

2.ARC(只自动管理OC对象, 不会自动管理C语言对象)

* CoreFoundation对象(C对象) : 只要函数中包含了create\new\copy\retain等关键字, 那么这些方法产生的对象, 就必须在不再使用的时候调用1次CFRelease或者其他release函数

3.block的注意

// block的内存默认在栈里面(系统自动管理)

void (^test)() = ^{

};

// 如果对block进行了Copy操作, block的内存会迁移到堆里面(需要通过代码管理内存)

Block_copy(test);

// 在不需要使用block的时候, 应该做1次release操作

Block_release(test);

[test release];

iOS 内存管理分析的更多相关文章

  1. 【转】cocos2d-x与ios内存管理分析(在游戏中减少内存压力)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=281 注:自己以前也写过coco ...

  2. cocos2d-x与ios内存管理分析(在游戏中减少内存压力)

    转自:http://www.cocos2dev.com/?p=281 注:自己以前也写过cocos2d-x如何优化内存的使用,以及内存不足的情况下怎么处理游戏.今天在微博中看到有朋友介绍了下内存,挺详 ...

  3. iOS内存管理策略和实践

    转:http://www.cocoachina.com/applenews/devnews/2013/1126/7418.html 内存管理策略(memory Management Policy) N ...

  4. iOS内存管理布局及管理方案-理论篇

    苹果设备备受欢迎的背后离不开iOS优秀的内存管理机制,那iOS的内存布局及管理方案是怎样的呢?我们一起研究下. 内存管理分为五大块 栈区(stack):线性结构,内存连续,系统自己管理内存,程序运行记 ...

  5. iOS内存管理

    iOS内存管理的方式是引用计数机制.分为MRC(人式引用计数)和ARC(自动引用计数). 为什么要学习内存管理? 内存管理方式是引用计数机制,通过控制对象的引用计数来实现操作对象的功能.一个对象的生命 ...

  6. 【Bugly干货分享】iOS内存管理:从MRC到ARC实践

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...

  7. iOS内存管理个人总结

    一.变量,本质代表一段可以操作的内存,她使用方式无非就是内存符号化+数据类型 1.保存变量有三个区域: 1>静态存储区 2>stack 3>heap 2.变量又根据声明的位置有两种称 ...

  8. IOS内存管理学习笔记

    内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...

  9. iOS内存管理编程指南

    iOS 内存管理 目录[-] 一:基本原则 二:成员变量的内存管理 三:容器对象与内存管理 四:稀缺资源的管理 五:AutoRelease 六:其他注意事项 iOS下内存管理的基本思想就是引用计数,通 ...

随机推荐

  1. db2 基础语法

    一.db2 基础 基本语法 注释:“--”(两个减号) 字符串连接:“||” 如set msg=’aaaa’||’bbbb’,则msg为’aaaabbbb’ 字符串的引用:‘’(一定用单引号),如果需 ...

  2. CSS:盒模型和position定位

    盒模型 页面上显示的每个元素(包括内联元素)都可以看作一个盒子,即盒模型( box model ).请看Chrome DevTools 里的截图: 可以显而易见的看出盒模型由 4 部分组成.从内到外分 ...

  3. HZAU2018年十大阅读之星演讲稿

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  4. [cloud][sdn] LBaaS/neutron / Octavia

    清晰/浅显: http://www.cnblogs.com/sammyliu/p/4656176.html IBM:写的一般般,价值不大 https://www.ibm.com/developerwo ...

  5. Linux中的轻量级进程

    在Linux中,轻量级进程可以是进程,也可以是线程.我们所说的线程,在Linux中,其实是轻量级进程之间共享代码段,文件描述符,信号处理,全局变量时: 如果不共享,就是我们所说的进程. 进程是资源管理 ...

  6. mysql from dual插入实现不插入重复记录

    在mysql中插入一或者多条记录的时候,要求某个字段的值唯一,但是该字段没有添加唯一性索引,可用from dual解决. select * from (select '2015080109' a,2 ...

  7. 1-2-编译U-boot

    1-2-编译U-boot 1.su+enter进入超级用户模式. 2.cd /mnt/+两次Tab去到根目录,ls显示共享文件夹里的文件. 3.解压tar xvfj uboot_TQ210_1.3.4 ...

  8. 【JMeter】【性能测试】参数化,内存溢出问题

    这一篇文章随便说一下JMETER的脚本参数化 1:Parameters的两种参数化方法 1.1:函数助手参数化 首先准备你的参数数据.我在bin/data中新建了一个dat文件,记事本另存为修改编码为 ...

  9. 前端 HTML form表单标签 input标签 type属性 checkbox 多选框

    多选框 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  10. 前端开发---HTML---标签

    HTML的标签内容 1.index <!--声明文档的类型 标记该文档为HTML5的文件--> <!DOCTYPE html> <!-- 页面的根节点 --> &l ...