MRC机制:
1、MRC机制原理:每个OC对象中都有一个retainCount变量,记录着当前使用该对象的个数,当该变量为0时,系统将释放该对象。
2、MRC机制中的方法:
1>retain:当对象调用该方法时,对象的retainCount变量+1。
2>release:当对象调用该方法时,对象的retainCount变量-1。
3>retainCount:当对象调用该方法时,返回当前对象的retainCount变量的值。如果为系统提供对象,建议不要使用该方法,因为结果不准确。
4>autorelease:将对象加入到栈顶的自动释放池中,并登记,不改变对象的retainCount变量值。
4>dealloc:当要释放该方法时,系统自动调用该方法。
3、MRC下内存管理原则:
1>只要出现new、alloc、copy(创建的对象retainCount变量默认为1),则必须在后面调用一次release方法。
2>只要添加对象的使用者,就必须立即调用retain方法。
3>只要删除对象的使用者,就必须立即调用release方法。
4>若使用者将使用权转移,无需调用任何方法,例如函数中创建一个对象,返回对象时的指针和创建对象时的指针不相同。
4、MRC机制下setter和dealloc方法的写法:
- (void)setDog:(Dog *) d{
if(_d != d){ // 防止野指针出现。p.d = d1; [d1 release]; p.d = d1;
[_d release];
_d = [d retain];
}
}
- (void)dealloc{
[_d release]; //将对象中所有的成员对象进行一次release操作。
[super dealloc]; //最后必须调用一次父类的dealloc方法。
}
5、自动释放池:
1>iOS5.0以前创建自动释放池:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
.......
[pool release]; // [pool drain];用于mac程序中
2>iOS5.0以后创建自动释放池:
@autoreleasepool{ // iOS5.0以后创建自动释放池
Person *p = [[[Person new] autorelease] autorelease]; // 调用两次autorelease方法,会向池中的登记表中登记两次,当池子销毁时,会向该对象发送两次release消息。
}
3>自动释放池缺点:
(-)自动释放池会延迟对象的release操作,即当池子被销毁时,才统一对池子中的对象进行release操作。
(-)避免将占内存大的对象放到池子中。
(-)避免在同一个池子中做大量的循环操作,造成内存峰值极速上升。
4>自动释放池的应用场景---快速创建类的对象,并将对象加入到栈顶的池子中:
+(instancetype) person{ // instancetype返回方法所在类的类型。
return [[[self alloc] init] autorelease]; // 使用self,根据调用的该方法的对象,创建相应对象。
} // [NSArray array]; 就是快速创建类的对象的方法,相当于[[[NSArray alloc] init] autorelease] |
|