-----<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]; } |
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |