0

我在我的应用程序中进行 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]有什么区别?

谢谢

4

2 回答 2

6

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

于 2012-09-13T07:09:10.723 回答
2

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

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

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

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

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

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

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

self.responseData = [NSMutableData data];
于 2012-09-13T07:30:39.067 回答