Autoreleasepool自动释放池与内存相关


iOS开发中的内存管理:

iOS管理有MRC和ARC

MRC: 在mac中 对象谁申请, 谁释放

ARC: 编译器在编译代码的时候,会根据代码的结构在适当的地方添加retain release autorelease语句.

autorelease自动释放池

标记为autorelease的对象,都会添加到最近一次创建的autoreleasepool自动释放池中

自动释放池销毁的时候 会对释放池中的所有对象发一次release消息.

使用类方法创建对象时,是使用autorelease管理对象, 延时释放

自动释放池什么时候创建

每一次消息循环开始的时候会先创建自动释放池

自动释放池什么时候销毁的

一次消息循环结束之前会释放自动释放池

什么是消息循环


消息循环有什么作用

保证应用程序不退出

循环监测事件,并执行相应的方法

自动释放池在什么时候使用

在循环中创建大量的临时变量时 要在循环一开始的时候就创建自动释放池

在开始一个子线程的时候要,要在子线程开始执行的时候创建一个自动释放池,否则会造成内存泄露,因为子线程无法访问主线程的自动释放池

事例:

          long largeNumber = 100000000;

for(int i = 0; i < largeNumber; ++i) {

    NSString*str = @"Hello World";

    str = [str stringByAppendingFormat:@" - %d", i];

    str = [str uppercaseString];

}

分析:有什么问题, 会造成什么影响

循环进行大量字符串拼接和大小写转换, 会生成大量无临时变量, cpu没时间进行释放, 造成内存消耗的飞涨

解决方法: 在一次循环开始的时候创建自动释放池, 让每一次的循环结束都倾倒一次自动释放池

内存方面的4个问题

内存泄露: 创建一个对象系统会给该对象分配一块内存,当该对象不再使用时,系统会回收该内存,当对象不再被使用,但是内存却没有回收, 会造成这块内存无法再分配给其他程序使用, 这就是"内存泄露”, 如子控件属性被strong修饰 就会造成内存泄露


野指针: 指向僵尸对象(指向内存不可用)的指针, 给野指针发送消息会报错


僵尸对象: 所占用内存已经被回收的对象, 僵尸对象不能再使用了


空指针: 没有指向任何对象的指针, 给空指针发送消息不会报错


内存溢出:


你可能感兴趣的:(内存管理,自动释放池)