------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
由于移动设备的内存及其有限,每个app所占用的内存也是有限制的,当app所占内存过大时,可能会造成闪退现象,影响用户体验。因此我们在做程序设计时,要对内存的分配与回收进行管理
1.内存管理范围:所有继承了NSObject的对象(所有OC对象、对象类型),对基本数据类型无效
2.只对OC对象进行内存管理的原因:非OC对象一般放在栈里面,而系统会自动回收栈内存,不需要我们管理。而OC对象是存放在堆空间的,系统不能自己回收内存,因此需要人为地对其进行管理
Person *p = [[Person alloc]init];
[p retain];
2)
给对象发送一条release消息,使引用计数器减1
Person *p = [[Person alloc]init];
[p release];
3)
给对象发送一条retainCount消息,获得当前引用计数器值
[p retainCount];
3.对象的销毁
-(void)dealloc{
[super dealloc];
}
4.野指针、空指针、僵尸对象
autoreleasepool{
Person *p =[ [Person alloc]init];
[p autorelease];
}
Book *b = [[Book alloc]init];
[b retain];
Person *p = [[Person alloc]init];
[p retain];
p.book = b;
[b retain];
[p release];
[b release];
[b release];
1)set方法的内存管理
-(void)setBook:(Book *)book{
if (book!=_book){ //判断是否有新的调用
[_book release]; //若有新调用,原来被调对象release,新被调对象retain
_book = [book retain];
}
}
2)多对象dealloc方法
-(void)dealloc{
[_book release];
[super dealloc];
}
3)内存管理原则
@property(nonatomic,retain) Book *b;
@property(nonatomic,assign) int age;
5)对象循环调用问题
//对象Person
@property(nonatomic,retain)Book *book;
//对象Book
@property(nonatomic,assign)Person *p;
__weak Person *p = [Person new];
这里的指针p就为弱指针,Person对象没有强指针指向它,立即被释放
//Person对象
@property(nonatomic,strong)Book *b;
//Book对象
@property(nonatomic.weak)Person *p;