OC中内存管理(MRC)--setter方法注意事项

//因无Xcode环境,代码不提供,只提供逻辑,如有错误,欢迎指出
//三种情况:第一种,无换房间情况,有换不同房间和换同一房间,逻辑将一个一个的写出
//第一种:
//第一步:新建两个类,一个为Person,另一个为Room;
//       Person中有一属性房间Room *r,手动生成其setter方法
//       Room中有一属性房间号
//第二步:新建对象房间r与人对象p,那么 r与p的retainCount都将为1,
//在上一篇OC内存多对象管理中,当一个对象被其//它的对象引用,
//那么这个对象的retainCount将加1(即在引用的时候在setter方法中retain),
//当然,你在新建r与p对象//时就已经retain了一次,那么也要有对应的release的,
//不过这一步,将是在p引用了房间对象后,再release对象r,
//在//release对象p,重写Person对象中的delloc方法,
//其中要写上释放对象r的一步操作;这样就达到了,在释放对象p的时//候,房间对象r也会被释放。

//详细步骤一二三:
//新建对象r
//新建对象p
//p引用对象r
//r对象release一次
//p对象release一次
//game over
下面配上一图:

093124_IYGC_2689738.png

//第二种:第二种将是今天说的重点,第一种只是一个前奏,换不同房间
//如上图;如果对第一房间r不满意,想再换第二个房间r2,
//可以自已先考虑下,再与我的分析做个对比
//第一:在上述(第一种情况)代码分析处 
//     //p引用对象r  //r对象release一次  在这两处的任一处后添加人对象p对 对象r2的引用
//第二:由于Person对象中的r指向了r2,那么在对象p释放的时候,
//他只可能释放房间r2的,r1的retainCount值仍为1,
//不能释放;
//第三步:解决方法:在Person中将属性Room *r的setter方法修改下,
//即调用setter方法时直接将上一对象释放掉,再将//现有对象retain,就解决了这个问题,
//但这样解决有问题,也就是第三种情况了。
//第三种情况:换了同一房间

//那么在第二种情况的第三步就会出问题,可先考虑下,再与我的分析作比较
//直接跳到第二种情况的第三步:你传过来的对象与上一次的对象是同一对象,
//那么就会被立刻释放掉了,你再retain会报
//错的,那么解决的方法也简单,直接来个判断就可以解决了。

//在企业中,一般重写delloc释放对象是这样的一个写法,self.room=nil;
//这是点方法的应用了,即调用了,setRoom,代码如下:
-(void)setRoom(Room *)room
{
    if(_room!=room)
    {
       [_room release];
       room=[room retain]; 
    }
}

//最后再顺带说一个叫retain的修饰符
@property(retain) (Room *)room;
//上一句就可以生成自己写的setter方法,是不是很方便

以上代码没有在Xcode上写,如有错误,欢迎指出。


转载于:https://my.oschina.net/HYLApple/blog/649688

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值