for循环的内存溢出问题

最近写了一个作品还原的for循环,循环大概是这样的。在图片一多的时候,就会崩溃。最后调试跟踪后,发现图片下载和转码的时候,会使用至少30m的内存。问题找到了,就可以处理了。

for循环的内存溢出问题_第1张图片
红圈处是内存使用大户

添加autoreleasepool以后,情况好多了 


for循环的内存溢出问题_第2张图片
在内存消耗最大的地方添加了autoreleasepool

然后我下载了一个含有20张图片的文档并进行了内存跟踪

for循环的内存溢出问题_第3张图片
使用前
for循环的内存溢出问题_第4张图片
使用后



为什么添加了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指针,

你可能感兴趣的:(for循环的内存溢出问题)