一,内存管理概念:
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];
}
}
七,@property参数:
1,@property参数:
1),原子性:atomic和noatomic,分别是加锁和不加锁。加锁安全,性能低;不加锁,不安全,性能高。(默认atomic)(将多线程在讲)
2),读写属性:readwrite和readonly,读写属性和只读属性。(默认readwrite)
3),set方法的处理:assign,retain,copy。
2,具体用法:
1),在一个类中有关联其他对象的时候,这个对象的 @property 参数需要使用retain;
@property(nonatomic,retain) Car *car;
2),在一个类中的实例变量是非对象类型的时候,@property 参数需要使用assign ;
@property(nonatomic,assign) int age;
3,通过setter和getter关键字,更改set和get的方法名称;
@property (nonatomic,assign,setter=isVip:,getter=isVip) BOOL vip; //_vip
八,@class关键字:
1,使用格式: @class 类名;
@class abcd;
含义: 告诉编译器,abcd 是一个类,至于类有哪些属性和方法,此处不去检测
好处: 如果abcd文件内容发生了改变,也不需要重新编译
2,@class的作用:
第一个作用是提高编译效率;
第二个作用是防止重复包含。
3,@class 的使用注意:
在.h文件中使用了@class abcd 声明了一个类之后; 在.m文件中要真正使用这个类的时候,必须得用#import XXX.h 导入这个类的头文件.
|
|