【总结】 - OC内存管理(2)

上篇文章对内存管理进行了概括性描述,本篇文章将对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被引用一次
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值