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修饰 就会造成内存泄露
野指针: 指向僵尸对象(指向内存不可用)的指针, 给野指针发送消息会报错
僵尸对象: 所占用内存已经被回收的对象, 僵尸对象不能再使用了
空指针: 没有指向任何对象的指针, 给空指针发送消息不会报错
内存溢出: