一,内存管理概念: 1,内存管理的区域: 内存管理主要是对内存中的堆区进行管理;
2,内存管理的内容: 内存管理只针对继承NSObject的对象进行内存管理,也就是说基本数据类型是不需要内存管理的;
3,一个APP所占用的内存超过20M时,系统就会向该程序发出,内存警告.
4,内存管理的原理: (1),通过对象的引用计数器(retainCount)管理,当调用对象的retain,new,alloc,copy方法时,引用计数加1;当调用对象的release,autorelease方法时,引用计数减1; (2),当对象的引用计数器为0的时候,对象会被回收;
5,内存管理的分类: (1),MRC,手动管理; (2),ARC,自动管理;
6,当我们的对象被系统回收的时候,会调用NSObject的dealloc方法,我们可以理解为对象的"临终遗言";
7,重写dealloc方法时: (1),先释放子类自己的对象的空间; (2),再释放父类的; - (void)dealloc { //1 先释放子类自己的对象的空间 NSLog(@"Person已经挂了"); //2 再释放父类的 [super dealloc]; }
二,内存管理原则: 1,谁创建(alloc,new),谁release或者autorelease; 2,谁retain,copy,mutableCopy,谁release或autorelease;
三,在对象内存管理中,我们研究的内容: 1,野指针; 1)定义的指针变量没有初始化; 2)指向的空间已经被释放了;
2,内存泄露; 如果栈区的指针已经释放了,而堆区的空间还没有释放,堆区的空间就被泄露了;
四,nil和Nil及NULL的区别:(面试题) nil 是一个对象值;如果我们要把一个对象设置为空的时候就用nil; Nil 是一个类对象的值,如果我们要把一个Class类型的对象设置为空的时候就用Nil ; NULL 是一个通用指针; NSNull 是一个对象,它用在不能使用nil的场合;
/*******************************下午******************************/
一, 1,如何避免野指针? 对象释放完了之后,将指针赋值为nil; Dog *d = [[Dog alloc] init]; [d release]; d = nil;
2,如何造成内存泄露? 一般情况下,都是没有遵守"内存管理的原则";
二,set方法的内存管理:
1)基本数据类型或者非对象类型:直接赋值 int float double long struct enum
-(void)setAge:(int)age { _age=age; }
2)OC对象类型,需要做如下判断; -(void)setCar:(Car *)car { //1.先判断是不是新传进来的对象 if(_car!=car){ //2 对旧对象做一次release [_car release];//若没有旧对象,则没有影响 //3.对新对象做一次retain _car=[car retain];
} }
|