最近写了一个作品还原的for循环,循环大概是这样的。在图片一多的时候,就会崩溃。最后调试跟踪后,发现图片下载和转码的时候,会使用至少30m的内存。问题找到了,就可以处理了。
添加autoreleasepool以后,情况好多了
然后我下载了一个含有20张图片的文档并进行了内存跟踪
为什么添加了autoreleasepool就能彻底的释放内存了呢?
这里就要讲到内存的管理机制。
自动释放池
每次创建的对象(都是autorelease属性)都会被注册到该线程中的autorelease pool中,在当次代码块没有执行完之前,pool里的对象是不会释放的。
在添加autorelease pool以后,池的block作用域外,该pool会被drain,其中注册的对象全部都会release,这样就保证内存不会出现不足的情况。
for page in pages {
@autoreleasepool{
// 生成大量对象,并注册到
//
}
// pool drain,池中对象将全体释放
}
那苹果是如何实现的呢?
id obj = [[anyClass alloc] init];
alloc // 计算容纳对象所需的空间大小,内存空间置0后返回一个isa指针,