iOS内存管理
概念:在iOS中,每个对象内部包含一个指向其父类的isa指针,并且包含一个引用计数retainCount.对一个对象进行内存管理就是关注他的retainCount,这是系统判断这个对象是否被回收的唯一依据,当且仅当retainCount=0对象才会被回收,并且是立即回收。
1.配对原则:只要出现了new,alloc,retain就要在相同作用域配对一个release或autorelease
2.最重要的两个问题:
1>野指针操作
和nil操作的区别: nil操作没有任何问题,而野指针是指存放已经
被释放的对象的地址的指S针
如何避免?在确定不再使用一个对象的后,将其指针赋为nil;
2>内存泄露
3.set方法
if(_obj != obj){
[_obj release];
_obj = [obj retain];
}
4.autorelease
1>自动释放池: @autoreleasepool{ }
对象存入到自动释放池(在自动释放池的作用域中调用了autorelease方法)中,当池子销毁时自动释放池会对其中的所有对象进行一次release操作.
tips:对象往autoreleasepool中存入几次,最终就会调用几次release
2>autorelease作用: 只是将对象存入自动释放池,并不会立刻使retainCount - 1
3>@autoreleasepool的嵌套
@autoreleasepool{
@autoreleasepool{
[obj autorelease];
}
}
在哪个池子的作用域范围内调用autorelease,就会把对象放入哪个池子中
4>什么时候用autorelease: 在类内部的方法创建一个对象,返回时调用autorelease(iOS自带的类都是这样做的)
5.ARC机制
1>概念:
0>>只要有强指针指向一个对象,系统就不会回收该对象
只要没有强指针指向,系统[立即]回收该对象
弱指针不会影响对象被回收
默认情况下,所有的指针都是强指针类型
1>>强指针strong
2>>弱指针weak
2>特点:简单,程序员不用再管理内存
3>一些注意:
1>>[super dealloc] [obj retain] [obj release]不能再被调用了,由系统调用
4>手动内存管理转ARC机制
Refactor->Convert to Objective-C ARC
5>ARC和非ARC共存 添加指令
6>类循环引用 只要把一方的strong改为weak并且在.h文件中使用@class 类名