本帖最后由 hm_pt 于 2015-10-29 23:01 编辑
-----<a target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
内存管理
1.对象所有权
2.OC内存管理分类
1)MRC 2)ARC 3)垃圾回收
3.手动内存管理
如果一个对象被释放,会调用该对象的dealloc方法,且先释放子类的内存空间,再释放父类的内存空间;
[p retainCount]; 判断对象的拥有者;
[p retain]; 对象的拥有者+1;
[p release];对象的拥有者-1;
4.单对象内存管理原则
谁创建谁release,谁retain 谁release
5.野指针
5.1 避免使用僵尸对象的方法: 对象释放后,给野指针赋值nil;
5.2 造成内存泄漏的表现:
1)没有遵守内存管理原则;
2)不当的使用nil;
3)在方法中对传入的对象进行了retain;
6 多个对象的内存泄漏
例子:人坐车去拉萨
set方法中的内存管理问题 :
1)基本类型的set方法
-(void)setAge(age){ _age = age}
2)oc对象的set方法
-(void)setCar(car) {
if(car!=_car){ //判断是否传入新对象 防止僵尸对象复活,程序报错
[ _car release]; // 将旧对象释放 防止旧对象无法释放造成的内存泄漏
_car = [car retain]; //将新对象引用加1 并在person的dealloc方法中[_car release]
}
}
7.@class的使用:
格式:@class 类名;
使用注意:1).h中进行@class 类名 2).m文件中#import "类名.h" 可以解决循环引入头文件问题
8.循环retain问题:
例如:p.dog = d; d.own = p; //内存泄漏
解决方法:其中一个对象多release一次;
@property 参数中一个使用assign,一个使用retain
9.自动释放池的使用:
、 1)创建自动释放池: @autoreleasepool{ 代码 }
2) 将对象加入释放池: [对象 autorelease];
自动释放池的使用场景:快速创建对象
Person *p = [Person person];
+(instanstype) person{
return [[[self alloc]init]autorelease];
}
|
|
|