上篇文章对内存管理进行了概括性描述,本篇文章将对retain方法和release方法的具体使用场景做出描述
release方法
上篇文章提到:
被遗忘一次,计数器-1(release方法)
被遗忘分为两种:主动遗忘和被动遗忘
使用场景
主动遗忘
方式一:调用者有了新对象,故意遗忘掉老对象
示例
一个Person有了新wife:
- (void)setWife:(Girl *)wife
{
if ( wife != _wife ) //判断准备结婚的wife是不是原来那个,如果不是:
{
[_wife release]; //把原来那个遗忘掉
_wife = [wife retain];
}
}
简写方法
@property (nonatomic,retain) Girl *wife;
方式二:调用者使命完成了,程序猿在main中手动释放它
示例
int main()
{
Person *Tom = [[Person alloc] init]; //生成了一个Person——Tom
[Tom release]; //Tom的使命完成了,被释放。
return 0;
简写方式
// 利用自动释放池以精简main函数中的release代码
// 1. 重写对象创建方法,使创建出来的对象自动置入自动释放池中
+ (id)person
{
return [[[Person alloc] init] autorelease];
}
// 2.采用重写的方法创建对象,并将对象置于自动释放池中
int main()
{
@autoreleasepool{
Person *Jim = [Person person];
}
return 0;
}
被动遗忘
调用者自身消亡了,不得已遗忘。
示例:
一个Person死掉了,他不得不放弃掉了自己的钱:
- (void)dealloc
{
[_money release]; //把钱放弃掉
[super release]; //正式消亡了
}
retain方法
上篇文章提到:
对象每被调用一次,计数器+1(retain方法)
即:当把对象B附给对象A时,需要给对象B使用retain方法,将其计数+1
示例:
仍用wife的例子:
- (void)setWife:(Girl *)wife
{
if ( wife != _wife )
{
[_wife release];
_wife = [wife retain]; //新wife被引用一次
}
}