简述iOS内存管理
简述iOS内存管理
iOS内存管理方式是引用计数机制(只存在堆区,只对堆区对象进行操作),通过控制对象的引用计数来实现操作对象的功能,一个对象的生命周期有生成、持有、释放、销毁。引用计数分为ARC、MRC,在MRC中,增加引用计数的方法为alloc、new、retian、copy,减少引用计数的方法为release、autorelease,当引用计数增减平衡时,系统会自动执行对象的dealloc方法,销毁对象,完成该对象的内存管理
引用计数管理内存的理念是:通过控制内存或者对象的引用来实现生成、持有、释放、销毁对象的操作
1、生成,对象的引用计数从0到1
2、持有,增加一个引用,让对象的引用计数加1
3、释放,减少一个引用,让对象的引用计数减1
4、销毁,当对象的引用计数到0,系统就会回收这个内存空间。容易造成野指针。
1、伪拷贝
相当于没有拷贝,只是让外界对象执行了一次retain操作。
- (id)copyWithZone:(NSZone *)zone {
return [self retain];
}
2、浅拷贝
拷贝的是地址,对象两个,共用一份内容,改变其中一个对象实例变量的值,另一个也会访问到改变之后的值,但是一定要注意,字符串如果指向常量区,那么改值相当于重指向
(id)copyWithZone:(NSZone *)zone{
Person *person = [[[Person allocWithZone:zone] init] autorelease];
person.name = self.name;
person.gender = self.gender;
person.mArr = self.mArr;
return person;
}
3 、深拷贝
对象两份,内容两份,改变其中一个的值,另一个也会发生改变
拷贝怎么实现,到底是深浅贝还是浅考贝,取决于内部代码的实现。
- (id)copyWithZone:(NSZone *)zone {
Person *person = [[Person allocWithZone:zone]init];
person.name = [self.name mutableCopy];
person.gender = [self.gender mutableCopy];
person.mArr = [self.mArr mutableCopy];
return person;
}