内存管理学习笔记1

 

1.看千锋的视频讲的内存管理, 例子将的遛狗原理,很僵硬的例子,暂且将就着理解。

     背景:一个人想要遛狗,中途可以换别的狗遛

所以首先得有一个狗的类 Dog;然后一个  person类 里有一个dog的变量,自己重载setDog函数

 

@synthsize dog= _dog;

 

 -(void) setDog:(Dog *)aDog

{

     if(_dog ! = aDog)  //先判断要设置的狗是不是原来的狗,避免误设置同一条狗,第一次设置时,_dog应该是nil,和要设置的不相等

     {

       [_dog release];      //将原来的狗释放掉

       _dog = [aDog retain];//设置新的狗

      }

}

然后在dealloc 函数中有句

-(void)dealloc

{

 [_dog release];

 [super release];

}

我开始看他这样写的时候就想,如果没有调用这个 setter 设置函数,那在dealloc函数中取释放一个不存在的对象不会报错吗.

后来讲师说 再c++中会报断言错误,但在ios中没问题,可以这样释放。

 @property(retain) dog;

加一个(retain) 关键字后,这样一个声明,程序会在@sythnsize dog = _dog;的时候 自动展成上述形式 

-(void) setDog:(Dog *)aDog

{

     if(_dog ! = aDog)  //先判断要设置的狗是不是原来的狗,避免误设置同一条狗,第一次设置时,_dog应该是nil,和要设置的不相等

     {

       [_dog release];      //将原来的狗释放掉

       _dog = [aDog retain];//设置新的狗

      }

}

-(Dog *)dog

{

   return _dog;

}

 

看delloac 函数

-(void) dealloc 

{

    self.dog = nil;// 这条语句 其实会调用 setter函数  相当于[self.dog setDog:nil];将nil 当做参数传进去。nil与之前值不等,之前值被释放。

    [super  dealloc];

}

// 以后凡是 在属性声明中 用到了  (retain)关键字,就可以再 dealloc中 用 点语法 把nil 传进去。在 setter 函数中就会做release 操作。

posted @ 2012-07-19 16:31  yessir  阅读(267)  评论(0编辑  收藏  举报