内存分析

静态分析(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. java.util.ResourceBundle学习笔记

    一.初次使用,从网上查的资料,知识点参考JDK API和博文http://lavasoft.blog.51cto.com/62575/184605(该博主写的清晰易懂) 二.自己在程序中的具体应用: ...

  2. 在eclipse中导入hadoop jar包,和必要时导入源码包。

    1. 解药hadoop包 1, C:\hadoop-2.7.2\share\hadoop  提取出所有的 jar 包, 到 _lib 文件夹下 2,将有含有source 名称的jar包 剪切出来 3, ...

  3. [No0000E0]批量打开当前路径下的文件

    for /r %i in ( *) do start %i

  4. git commit -m 与 git commit -am的区别

    字面解释的话,git commit -m用于提交暂存区的文件:git commit -am用于提交跟踪过的文件 要理解它们的区别,首先要明白git的文件状态变化周期,如下图所示 工作目录下面的所有文件 ...

  5. Vue SSR 配合Java的Javascript引擎j2v8实现服务端渲染2创建Vue2+webpack4项目

    前提 安装好nodejs并配置好环境变量,最好是 node10,https://nodejs.org/en/download/ 参考我之前的文章 debian安装nodejs Yarn &&a ...

  6. iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)

    1. 前言 Block:带有自动变量(局部变量)的匿名函数.它是C语言的扩充功能.之所以是拓展,是因为C语言不允许存在这样匿名函数. 1.1 匿名函数 匿名函数是指不带函数名称函数.C语言中,函数是怎 ...

  7. [hyperscan][pkg-config] hyperscan 从0到1路线图

    经过一系列的研究学习,知识储备之后,终于,可以开始研究hyperscan了. [knowledge][模式匹配] 字符匹配/模式匹配 正则表达式 自动机 [knowledge][perl][pcre] ...

  8. C#查找字符串位置

    int i=zifuchuan.IndexOf(","); int n=(zifuchuan.SubString(i+1)).IndexOf(","); int ...

  9. PLSQL复合触发器

    复合触发器范例 create or replace trigger compound_trigger for insert or update or delete on dept_x compound ...

  10. 《linux 文件目录》- touch/rm/mv/cat/head/tail/cp/mkdir/chmod/chown/find/locate/which/whereis

    一:基本 / 根目录下目录结构定义 /bin 常见的用户指令 ls/echo ...... 等 /boot 内核和启动文件 /dev 设备文件 /etc 系统和服务配置文件 /home 用户家目录 / ...