[NSMutableData data]和[[NSMutableData alloc] init]之间的区别

时间:2012-09-13 07:03:35

标签: iphone ios

我正在我的应用程序中进行JSON解析,当我使用 responseData = [NSMutableData data]; 时,它在[responseData setLength:0]上崩溃;

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

   [responseData setLength:0];   // CRASH HERE

}

当我使用 responseData = [[NSMutableData alloc] init]; 时,我的程序运行正常。我已经在.h文件中创建了属性

@property (strong, nonatomic) NSMutableData* responseData;

并在.m文件中合成

@synthesize responseData;

问题 [NSMutableData data] [[NSMutableData alloc] init]之间有什么区别;

感谢

2 个答案:

答案 0 :(得分:6)

[NSMutableData data]返回一个自动释放的对象,而[[NSMutableData alloc] init]返回一个保留的对象。

答案 1 :(得分:2)

[NSMutableData data]返回一个autorelease对象,即它将被添加到自动释放池中,并且在帧结束时将在该对象上调用一个释放,如果引用计数变为0,则将从记忆中清除。

[[NSMutableData alloc] init]返回一个引用计数为1的对象,在此完成后,您需要通过调用release将其从内存中删除。

因此,您的问题的解决方案是:

// 1. retain explicitly
responseData = [[NSMutableData data] retain];

// 2. or else define
@property (retain, nonatomic)

第二个选项将保留该对象。因此,即使在release池上调用autorelease,它也不会被刷新,因为它的保留(引用计数不会为零)

当您使用self.responseData时,其引用计数会增加1,因此即使您分配autorelease对象,它也会因声明属性而保留:

self.responseData = [NSMutableData data];