- (void)setBook:(Book *)book {
if (_book != book) { //如果有StudentOne和StudentTwo里面都有属性book,他需要计数器加1,为什么要有_book!=book,新的Stu对象_book属性为nil,所以不可能等于后面的book,每个Student引用一次,计数器都要加1,N个student引用,计数器的值就是N
// 先释放旧的成员变量,旧的对象一般是nil,重点,记住释放的是_book成员变量,而不是book,book都是+1
[_book release];
// 再retain新传进来的对象
_book = [book retain];//赋相同的值给计数器加1,完全没有必要,retain存在的原因,就是利用计数器节约内存空间,不像copy那样,在不同的地址上创建一样的对象,如,main 里面有StuOne和StudentTwo,他们使用的是用一个book对象,你要做的只是让它的计数器加1即可,释放其中一个StuOne而不影响StuTwo;
}
}
retian是在一个地址上使对象的计数器加1,copy是在不同的地址上copy一样的对象