我正在我的应用程序中进行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]之间有什么区别;
感谢
答案 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];