Ios内存性能及原理 wwdc笔记

iOS内存的基本原理

内存是如何初始化和被管理的?

内存类型: 干净内存和脏内存

干净内存: 从磁盘上拷贝到内存中的空间, 比如, 代码, framework,内存映射文件. 脏内存: 其他的内存空间. 比如 在堆上的初始化数据, 数据库缓存,解压的图片数据等. **大部分应用初始化的数据都是脏内存 ** 举例如下:

- (void)displayWelcomeMessage {
NSString *welcomeMessage = [NSString stringWithUTF8String:“Welcome to WWDC!”];
self.alertView.title = welcomeMessage;
[self.alertView show];
}

welcomeMessage 是脏内存, 因为字符串Welcome to WWDC! 在静态数据区,它倍复制一份到堆上给了welcomeMessage.

- (void)displayWelcomeMessage {
NSString *welcomeMessage = @”Welcome to WWDC!”;
self.alertView.title = welcomeMessage;
[self.alertView show];
}

这次welcomeMessage是干净内存, 因为没有复制一份.

- (void)allocateSomeMemory {
void *buf = malloc(10 * 1024 * 1024);
…
}

虽然malloc是在堆上初始化数据, 但是 buf 没有实际存储数据, 所有buf是干净内存.

- (void)allocateSomeMemory {
void *buf = malloc(10 * 1024 * 1024);
for (unsigned int i = 0; i < sizeof(buf), i++) {
 buf[i] = (char)random();
}
…
}

但是一旦使用了buf后, buf就是脏内存了.

UIImage *wwdcLogo = [UIImage imageNamed:@”WWDC12Logo”];

初始化UIImage,UIImage其实是CGImage的包装, CGImage生成jpeg 和 bitmap, 在内存中会有未压缩的bitmap数据,是脏内存.

###当iOS运行在低内存是会发生什么### iOS开始的时候, 干净内存比例很大,当我们运行app的时候, 随着运行的进行, 初始化数据, 产生了脏内存, 进而是脏内存比例增大,干净内存比例减小, 最后产生内存压力, 内存不够用了, 这时候系统会终结掉后台应用, 释放属于应用的脏数据, 腾出内存空间.

内存警告

####这是一次挑战####

这是一次机会

一定要注意脏内存,因为脏内存是由应用创建,如果不清除,只有应用被终结后才能释放, 使用Profile的VM Tracker去检测内存使用情况, 避免出现大范围经常性波动, 减少内存还可以使用 @autoreleasepool.

找到内存的问题

如何检测内存问题 内存不应该在重复一个操作中持续增长, 比如: push和pop UIViewcontroller,滑动UITableview, 操作数据库搜索

使用工具和陷阱

使用 Allocations Instrument 来检测内存是否泄露, 遇到内存泄露可以检查是否在块中使用了self对象, 应该换成 __weak 修饰的self这样不增加计数引用. 更多的信息可以查阅官方手册. Instruments Documentation Instruments User Guide Instruments User Reference 地址

官方关于虚拟内存的说明

视频: WWDC2012应用性能:内存

如有不正确,欢迎批评!