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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© D调的沉默 中级黑马   /  2014-5-3 11:08  /  986 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 D调的沉默 于 2014-5-3 16:28 编辑

代码如下
  1. int main(int argc, const char * argv[])
  2. {
  3.     Person * p=[Person new];
  4.     Car * car=[Car new];
  5.     car.wheels = 2;
  6.    
  7.     p.car = car;
  8.    
  9.     Car * car2 = [Car new];
  10.     car2.wheels = 4;
  11.    
  12.     p.car = car2;
  13.    
  14.     NSUInteger a = [car retainCount];
  15.    
  16.     NSLog(@"a=%ld",a);

  17.     [car release];
  18.    
  19.     a = [car retainCount];
  20.     NSUInteger b = [car2 retainCount];
  21.     NSLog(@"a=%ld,b=%ld",a,b);
  22.     [p release];
  23.     b = [car2 retainCount];
  24.     NSLog(@"b=%ld",b);
  25.     [car2 release];
  26.    
  27.     return 0;
  28. }
复制代码
主函数中代码如上,在【p release】之后关于car2 对象的使用都回出现错误,但是在【p release】这之前car2的引用次数为2啊,【p release】了它的引用次数应该为1啊,为什么就直接不能使用了。。。在
person类中得-delloc方法代码如下

  1. - (void)setCar:(Car *)car
  2. {
  3.     _car = car;
  4.     _car = [_car retain];
  5. }

  6. - (void)dealloc
  7. {
  8.     [_car dealloc];
  9.     [super dealloc];
  10.     NSLog(@"person delloc");
  11. }
复制代码

求解释啊。。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 执着的土豆 于 2014-5-3 14:31 编辑

我分析了一下,关键点是在你的Person的dealloc方法中,你调用了_car 的dealloc方法,一般在这里是调用_car的release方法。如果你没重写car的dealloc方法,那么将调用NSObject的dealloc方法,直接销毁调用dealloc对象的内存。详细分析见代码,希望可以帮你解惑
  1. //------------------------特别牛逼的分割线----------------------------------------------------
  2. //------------------------主函数------------------------------------------------------------
  3. #import <Foundation/Foundation.h>
  4. #import "Person.h"
  5. #import "Car.h"
  6.     int main(int argc, const char * argv[])
  7.     {
  8.         /* 以后尽量不要用new了,用alloc init吧,又alloc必有release或者autorelease*/
  9.         Person * p=[Person new];//P的retainCount=1
  10.         Car * car=[Car new];    //car的retainCount=1
  11.         car.wheels = 2;
  12.         
  13.         p.car = car; //car的retainCount2
  14.         
  15.         Car * car2 = [Car new]; //car2的retainCount=1
  16.         car2.wheels = 4;
  17.         
  18.         p.car = car2; //car2的retainCount=2
  19.         
  20.         NSUInteger a = [car retainCount];//a=2
  21.         
  22.         NSLog(@"a=%ld",a);
  23.         
  24.         [car release]; //car的retainCount=1
  25.         
  26.         a = [car retainCount]; //a=1
  27.         NSUInteger b = [car2 retainCount];//b=2
  28.         NSLog(@"a=%ld,b=%ld",a,b);
  29.         [p release];//p释放掉,同时调用car2的dealloc方法。而这个方法是系统自动调用的,不是人为调用的。因此这里会报错,这里一旦报错,后面程序自然无法运行。明杰老师在内存管理小结的视频中,有讲。
  30.         b = [car2 retainCount];
  31.         NSLog(@"b=%ld",b);
  32.         [car2 release];
  33.         
  34.         return 0;
  35.     }
复制代码
  1. //------------------------Person.h----------------------------------------------------------
  2. #import <Foundation/Foundation.h>
  3. @class Car;
  4. @interface Person : NSObject
  5. {
  6.     Car *_car;
  7. }
  8. - (void)setCar:(Car *)car;
  9. - (void)dealloc;
  10. @end
复制代码
  1. //------------------------Person.m----------------------------------------------------------
  2. #import "Person.h"

  3. @implementation Person
  4. - (void)setCar:(Car *)car
  5. {

  6.     _car = car;
  7.     _car = [_car retain];
  8. }
  9. - (void)dealloc
  10. {
  11.     [_car dealloc]; //[color=Red]关键点:!!!!    你这里直接调用了对象car2的dealloc方法。而这个方法是系统自动调用的。
  12.     [super dealloc];
  13.     NSLog(@"person delloc");
  14. }

  15. @end
复制代码

  1. //------------------------car.h----------------------------------------------------------
  2. #import <Foundation/Foundation.h>

  3. @interface Car : NSObject
  4. @property int wheels;
  5. @end
复制代码

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
执着的土豆 发表于 2014-5-3 13:45
我分析了一下,关键点是在你的Person的dealloc方法中,你调用了_car 的dealloc方法,一般在这里是调用_car ...

恩对的,按照你的重新敲了下,发现确实是因为调用dealloc方法的错误!!谢谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马