黑马程序员--有关OC内存管路set方法的思考

来源:互联网 发布:家庭生活记账软件 编辑:程序博客网 时间:2024/05/07 02:41
基本数据类型不需要内存管理,管理的是对象类型
分析:
   int main()
        {
                Person *p = [[Person alloc] init];  //p->1
                p.age = 20;
                
                Car *c1 = [[Car alloc] init];  //c1->1
                c1.speed = 250;

                p.car = c1;  // 或者[p setCar: c1];   p拥有c1,c1->2

                Car *c2 = [[Car alloc] init];  //创建c2,c2->1
                p.car = c2;  //p将车换成了c2,c2->2
                [c2 release];  //c2->1
                [c1 release]; //c1->1
                [p release];  //此时p的计数器变为0,调用dealloc方法 p->0, c2->0, c1->1
                                   //此时的c1计数器为1,所以并没有释放,出现错误
        }
             Person类的dealloc方法:
                  - (void)dealloc
                 {
                        //当人不在了,车也没用了,对车做一次release操作
                        [_car release];
                         [super dealloc];
                 }
              所以set方法中如果发现传入的对象和之前的对象不同,要对旧对象作一次release操作,对新对象作一次retain操作
                     set方法应改为:
                - (void)setCar: (Car*)car
                {
                        if (car != _car)
                        {
                                [_car release];
                        }
                        _car = [car retain];
                }            

总结:
     内存管理代码规范:
        1.只要调用了alloc,必须有release(autorelease)
          如果对象不是通过alloc产生,就不需要release
        2.set方法的代码规范:
                1>基本数据类型:
                        直接复制:
                                - (void)setAge: (int)age
                                {
                                        //基本数据类型是不需要管理内存的
                                        _age = age;
                                }
                2>OC对象类型:
                        - (void)setCar: (Car*)car
                        {
                                //1.先判断是不是刚传进来的对象
                                if (car != _car)
                                {
                                        //2.对就对象做一次release
                                        [_car release];
                                        
                                }
                                //3.对新对象做一次retain
                                        _car = [car retain];
                                
                        }
        3.dealloc方法的代码规范:
                1>一定要调用[super dealloc],而且放到最后面
                2>对当前对象(self)所拥有的其他对象做一次release
                - (void)dealloc
                {
                        [_car release];
                        [super dealloc];
                }
0 0
原创粉丝点击