A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 洪吉童 于 2015-10-14 22:24 编辑
  1. //***********Person.h **************/
  2. #import <Foundation/Foundation.h>

  3. @class Car;
  4. @interface Person : NSObject

  5. @property (nonatomic,retain) Car *car;
  6. @end

  7. /**************person.m*********************/
  8. #import "Person.h"
  9. #import "Car.h"
  10. @implementation Person
  11. -(void)dealloc
  12. {
  13.     [car release];
  14.     NSLog(@"Person对象被回收");
  15.     [super dealloc];
  16. }
  17. @end

  18. /************************Car.h************************/
  19. #import <Foundation/Foundation.h>
  20. @class Person;
  21. @interface Car: NSObject

  22. @property (nonatomic,retain)Person *person;
  23. @end

  24. /**************Car.m*********************/
  25. #import "Car.h"

  26. @implementation Car
  27. -(void)dealloc{
复制代码
  1. [person release];
  2.     NSLog(@"car对象被回收");
  3.     [super dealloc];
  4. }
  5. @end
  6. /********main.****************/
  7. #import <Foundation/Foundation.h>
  8. #import "Car.h"
  9. #import "Person.h"
  10. int main(int argc, const char * argv[]) {
  11.    
  12.     Person *p = [[Person alloc]init];
  13.     Car *c = [[Car alloc] init];
  14.     p.car = c ;
  15.     c.person = p;
  16.     [c release];//这一句执行完不是应该执行c的临终遗言dealloc吗?怎么直接执行下面的[p release]了?
  17.     [p release];
  18.     return 0;
  19. }
复制代码
上面的最后几行代码中[c release];,不是应该执行c的临终遗言dealloc吗?怎么直接执行下面的[p release]了?

13 个回复

倒序浏览
后面没看,同学看的很快啊
回复 使用道具 举报
我已经知道答案了,那时候引用计数还不为0
回复 使用道具 举报
{:3_54:}你这不是循环retain了么,自己看视频把,retain自带重写set方法功能,使传入的对象计数器加1。所以程序执行结束都不管person还是car的计数器都是1,不是说调用release就回触发dealloc的,计数器为0才触发
回复 使用道具 举报
wwf707542865 发表于 2015-10-14 22:32
后面没看,同学看的很快啊

怎么说谁快谁慢啊?我们看的时间起点不一样啊。我觉得我看的够慢的了
回复 使用道具 举报
Abuzzworld 发表于 2015-10-14 22:37
你这不是循环retain了么,自己看视频把,retain自带重写set方法功能,使传入的对象计数器加1。所以 ...

恩,我已经知道了
回复 使用道具 举报
话说,你这个真的编译能通过吗 ?  我自己复制了你的一份,然后试着运行下,有报错。
问题如下:在dealloc方法中,调用实例变量应该有“_”吧,如在Person的 dealloc中  应该是 _car dealloc。
然后就是 你的循环ratain,应该有一个对象先行脱钩,也就是少一个对象retain,比如在Person.m中,property方法的参数可以修改为assign,只复制不retain,此时的dealloc方法就不需要_car release了。 这样运行下来,就可以两个对象都释放。
ps:这样的做法,car的retain count为1,person retain count为2。
回复 使用道具 举报
ff774411 发表于 2015-10-15 10:12
话说,你这个真的编译能通过吗 ?  我自己复制了你的一份,然后试着运行下,有报错。
问题如下:在dealloc ...

这个我没编译,只是复制了一下代码。我现在知道什么原因了。
回复 使用道具 举报
chensc 金牌黑马 2015-10-16 21:49:38
9#
学习学习!
回复 使用道具 举报
受教了,感谢
回复 使用道具 举报
围观,看看
回复 使用道具 举报
好厉害,看不懂
回复 使用道具 举报
chensc 金牌黑马 2015-10-18 16:46:07
13#
学习学习!
回复 使用道具 举报
配对原则
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马