数据在使用 ASIHTTPRequest 异步模式之前被释放

Posted

技术标签:

【中文标题】数据在使用 ASIHTTPRequest 异步模式之前被释放【英文标题】:Data gets deallocated before use with ASIHTTPRequest asynchronous mode 【发布时间】:2011-09-04 09:56:27 【问题描述】:

我在从我的 viewDidLoad() 调用的函数中以异步模式使用 ASIHTTPRequest

NSURL *url = [NSURL URLWithString:@"http://somewebsite.com/data.txt"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];

这是我的 requestFinished() ,我在其中进行一些文本替换并使用从网站收到的数据填充 NSArray。它只是文本,每行一个数据项。 viedDidLoad() 中的 NSArray(和 alloc / init)。

- (void)requestFinished:(ASIHTTPRequest *)request

   NSString *sTemp = [request responseString]; 
   sTemp = [sTemp stringByReplacingOccurrencesOfString:@"\n" withString:@","];          
   arrayTidalData = [sTemp componentsSeparatedByString:@","]; 
   NSLog(@"Loaded %d items into the array",[arrayTidalData count]);
   [tableTideTimes reloadData];

NSLog 报告 127 个数据项。

现在,我使用 NSArray 数据填充 UITableView。 但是,在 cellForRowAtIndexPath() 中,当我尝试访问 NSArray (arrayTidalData) 时,例如通过计数,我得到以下信息:

TideTimes[14696:b303] * -[__NSArrayM count]:消息发送到释放的实例 0x4e6c6a0

(我打开 NSZOMBIEEnabled = YES 来获取此数据)

似乎 NSArray 在我可以使用之前已被释放。我还尝试使用 requestFinish() 中的数据填充 NSString,但得到了相同的结果。

我是错过了一些非常简单的事情还是我做错了什么?

(这是我第一次使用 ASIHTTPRequest)

【问题讨论】:

【参考方案1】:

替换

arrayTidalData = [sTemp componentsSeparatedByString:@","];

arrayTidalData = [[sTemp componentsSeparatedByString:@","] retain];

这是因为componentsSeparatedByString: 返回autoreleased 对象。所以在方法requestFinished: 结束工作后是released

并且不要忘记在工作结束时发布(例如,dealloc)。

【讨论】:

谢谢,我根本没想过要添加保留。太棒了!

以上是关于数据在使用 ASIHTTPRequest 异步模式之前被释放的主要内容,如果未能解决你的问题,请参考以下文章

异步添加图像 - ASIHTTPRequest

我应该如何处理 iOS 中的 ASIHTTPRequest 异步调用?

iPhone ASIHTTPRequest 从 requestFinished 方法中异步提取响应

ASIHTTPRequest取消异步请求

在 Restkit 中使用块(如 ASIHttpRequest 块)

ASIHTTPRequest框架的简单使用