当我使用responseData = NSMutableData数据时,我在应用程序中执行JSON解析;在responseData setLength:0上崩溃;
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[responseData setLength:0]; // CRASH HERE
}当我使用responseData=[NSMutableData allocinit];时,我的程序运行得很好。我已经在.h文件中创建了属性
@property (strong, nonatomic) NSMutableData* responseData;并在.m文件中进行合成
@synthesize responseData;问题: NSMutableData data和[NSMutableData allocinit]之间的区别是什么?
谢谢
发布于 2012-09-13 07:09:10
[NSMutableData data]返回一个自动释放的对象,而[[NSMutableData alloc] init]返回一个保留的对象。
发布于 2012-09-13 07:30:39
[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];https://stackoverflow.com/questions/12401069
复制相似问题