黑马程序员技术交流社区
标题:
关于内存retain和release的问题。
[打印本页]
作者:
D调的沉默
时间:
2014-5-3 11:08
标题:
关于内存retain和release的问题。
本帖最后由 D调的沉默 于 2014-5-3 16:28 编辑
代码如下
int main(int argc, const char * argv[])
{
Person * p=[Person new];
Car * car=[Car new];
car.wheels = 2;
p.car = car;
Car * car2 = [Car new];
car2.wheels = 4;
p.car = car2;
NSUInteger a = [car retainCount];
NSLog(@"a=%ld",a);
[car release];
a = [car retainCount];
NSUInteger b = [car2 retainCount];
NSLog(@"a=%ld,b=%ld",a,b);
[p release];
b = [car2 retainCount];
NSLog(@"b=%ld",b);
[car2 release];
return 0;
}
复制代码
主函数中代码如上,在【p release】之后关于car2 对象的使用都回出现错误,但是在【p release】这之前car2的引用次数为2啊,【p release】了它的引用次数应该为1啊,为什么就直接不能使用了。。。在
person类中得-delloc方法代码如下
- (void)setCar:(Car *)car
{
_car = car;
_car = [_car retain];
}
- (void)dealloc
{
[_car dealloc];
[super dealloc];
NSLog(@"person delloc");
}
复制代码
求解释啊。。
作者:
执着的土豆
时间:
2014-5-3 13:45
本帖最后由 执着的土豆 于 2014-5-3 14:31 编辑
我分析了一下,关键点是在你的Person的dealloc方法中,你调用了_car 的dealloc方法,一般在这里是调用_car的release方法。如果你没重写car的dealloc方法,那么将调用NSObject的dealloc方法,直接销毁调用dealloc对象的内存。详细分析见代码,希望可以帮你解惑
//------------------------特别牛逼的分割线----------------------------------------------------
//------------------------主函数------------------------------------------------------------
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Car.h"
int main(int argc, const char * argv[])
{
/* 以后尽量不要用new了,用alloc init吧,又alloc必有release或者autorelease*/
Person * p=[Person new];//P的retainCount=1
Car * car=[Car new]; //car的retainCount=1
car.wheels = 2;
p.car = car; //car的retainCount2
Car * car2 = [Car new]; //car2的retainCount=1
car2.wheels = 4;
p.car = car2; //car2的retainCount=2
NSUInteger a = [car retainCount];//a=2
NSLog(@"a=%ld",a);
[car release]; //car的retainCount=1
a = [car retainCount]; //a=1
NSUInteger b = [car2 retainCount];//b=2
NSLog(@"a=%ld,b=%ld",a,b);
[p release];//p释放掉,同时调用car2的dealloc方法。而这个方法是系统自动调用的,不是人为调用的。因此这里会报错,这里一旦报错,后面程序自然无法运行。明杰老师在内存管理小结的视频中,有讲。
b = [car2 retainCount];
NSLog(@"b=%ld",b);
[car2 release];
return 0;
}
复制代码
//------------------------Person.h----------------------------------------------------------
#import <Foundation/Foundation.h>
@class Car;
@interface Person : NSObject
{
Car *_car;
}
- (void)setCar:(Car *)car;
- (void)dealloc;
@end
复制代码
//------------------------Person.m----------------------------------------------------------
#import "Person.h"
@implementation Person
- (void)setCar:(Car *)car
{
_car = car;
_car = [_car retain];
}
- (void)dealloc
{
[_car dealloc]; //[color=Red]关键点:!!!! 你这里直接调用了对象car2的dealloc方法。而这个方法是系统自动调用的。
[super dealloc];
NSLog(@"person delloc");
}
@end
复制代码
//------------------------car.h----------------------------------------------------------
#import <Foundation/Foundation.h>
@interface Car : NSObject
@property int wheels;
@end
复制代码
作者:
D调的沉默
时间:
2014-5-3 15:06
执着的土豆 发表于 2014-5-3 13:45
我分析了一下,关键点是在你的Person的dealloc方法中,你调用了_car 的dealloc方法,一般在这里是调用_car ...
恩对的,按照你的重新敲了下,发现确实是因为调用dealloc方法的错误!!谢谢了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2