//因无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
下面配上一图:
//第二种:第二种将是今天说的重点,第一种只是一个前奏,换不同房间
//如上图;如果对第一房间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上写,如有错误,欢迎指出。