1、
内存管理遵循法则:谁污染谁治理,谁申请谁释放。
OS引入了Automatic Reference Count(ARC),编译器可以在编译时对obj-c对象进行内存管理。
之前,obj-c的内存管理方式称作引用计数,就是obj-c对象每被”使用”一次,引用计数+1,当引用计数为0时,系统会回收内存.用程序语言表达,就是allco的要release,retain/copy的要release.还有某些容器add的,也要release等等.
Student *stu = [[Student alloc]init];
[stu release];
[stu retain];
[stu release];
2、复写dealloc方法:
-(void)dealloc{
//最好在super之前释放自己的内存
[_book release];
[super dealloc];//一定释放系统的内存
}
3、set方法的内存管理
-(void)setBook:(Book *)book{
if(_book != book ){
[_book release]; //第一次set,_book为空,在oc中空指针不报错,野指针报错
_book = [_book retain]; //相当于下面两句
//[_book retain];
//_book = book ;
}
}
4、空指针与野指针:首先说明空指针会报错,野指针不会报错。
当一个对象被赋值为空时: Student *stu =[Student new];
stu = nil;
[stu release]; //此处的student对象已为空,但是调用release方法不会报错
当一个对象已经被释放,也就是它的计数器为0:
Student *stu =[Student new ];
[stu release];
[stu release]; //此处的student对象在之前已经被释放,他的计数器为0,他在调用release方法就会出现野指针错误
OS引入了Automatic Reference Count(ARC),编译器可以在编译时对obj-c对象进行内存管理。
之前,obj-c的内存管理方式称作引用计数,就是obj-c对象每被”使用”一次,引用计数+1,当引用计数为0时,系统会回收内存.用程序语言表达,就是allco的要release,retain/copy的要release.还有某些容器add的,也要release等等.
Student *stu = [[Student alloc]init];
[stu release];
[stu retain];
[stu release];
2、复写dealloc方法:
-(void)dealloc{
//最好在super之前释放自己的内存
[_book release];
[super dealloc];//一定释放系统的内存
}
3、set方法的内存管理
-(void)setBook:(Book *)book{
if(_book != book ){
[_book release]; //第一次set,_book为空,在oc中空指针不报错,野指针报错
_book = [_book retain]; //相当于下面两句
//[_book retain];
//_book = book ;
}
}
4、空指针与野指针:首先说明空指针会报错,野指针不会报错。
当一个对象被赋值为空时: Student *stu =[Student new];
stu = nil;
[stu release]; //此处的student对象已为空,但是调用release方法不会报错
当一个对象已经被释放,也就是它的计数器为0:
Student *stu =[Student new ];
[stu release];
[stu release]; //此处的student对象在之前已经被释放,他的计数器为0,他在调用release方法就会出现野指针错误