首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[NSMutableData数据]与[[NSMutableData alloc]init]之间的差异

[NSMutableData数据]与[[NSMutableData alloc]init]之间的差异
EN

Stack Overflow用户
提问于 2012-09-13 07:03:35
回答 2查看 2.7K关注 0票数 0

当我使用responseData = NSMutableData数据时,我在应用程序中执行JSON解析;在responseData setLength:0上崩溃;

代码语言:javascript
复制
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

   [responseData setLength:0];   // CRASH HERE

}

当我使用responseData=[NSMutableData allocinit];时,我的程序运行得很好。我已经在.h文件中创建了属性

代码语言:javascript
复制
@property (strong, nonatomic) NSMutableData* responseData;

并在.m文件中进行合成

代码语言:javascript
复制
@synthesize responseData;

问题: NSMutableData data[NSMutableData allocinit]之间的区别是什么?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-13 07:09:10

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

票数 6
EN

Stack Overflow用户

发布于 2012-09-13 07:30:39

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

[[NSMutableData alloc] init]返回一个具有引用计数1的对象,在这里,您需要通过调用release来显式地从内存中删除它。

所以解决你的问题的方法是:

代码语言:javascript
复制
// 1. retain explicitly
responseData = [[NSMutableData data] retain];

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

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

当您使用self.responseData时,它的引用计数增加了1,所以即使您指定autorelease对象,由于声明的属性,也保留了它:

代码语言:javascript
复制
self.responseData = [NSMutableData data];
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12401069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档