A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hm_pt 中级黑马   /  2015-10-29 23:01  /  896 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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];
                           }

1 个回复

倒序浏览
一起加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马