内存管理学习笔记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 操作。