滚动浏览桌面视图后,我的应用程序崩溃了“修改正在最终确定的图层”消息。
我认为错误是因为我在方法结束时发布了'videoView'(第二行代码)。
如何解决此问题?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* PlaceholderCellIdentifier = @"PlaceholderCell";
GenericObject *youTubeVid = [self.searchResultArray objectAtIndex:indexPath.row];
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier]autorelease];
}
UIWebView *videoView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 104, 104)];
NSString *cellid=[NSString stringWithFormat:@"Cell%i%i", indexPath.section, indexPath.row];
if([self.webViewCache objectForKey:cellid])
{
videoView=[self.webViewCache objectForKey:cellid];
}
else
{
NSString *url = [NSString stringWithFormat:@"http://www.youtube.com/watch?v=%@",youTubeVid.vid];
NSString *videoHTML = [self embedYouTube:url frame:CGRectMake(0, 0, 104, 104)];
[videoView loadHTMLString:videoHTML baseURL:nil];
[self.webViewCache setObject:videoView forKey:cellid]; //Save webview in dictionary
}
[cell.contentView addSubview:videoView];
//Error seems to be here
[videoView release];
return cell;
}
答案 0 :(得分:2)
错误是由于行,
if([self.webViewCache objectForKey:cellid])
{
videoView=[self.webViewCache objectForKey:cellid];
}
这里您只是从字典中获取Web视图,这显然会返回一个autoreleased
对象。因此,当您尝试释放它时(不知道它是已分配还是仅从字典中获取),就会发生错误。
一个解决方案是retain
videoView
。
videoView=[[self.webViewCache objectForKey:cellid] retain];
答案 1 :(得分:1)
您正在分配
UIWebView *videoView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 104, 104)];
然后,您可以将此引用替换为
中的其他内容videoView=[self.webViewCache objectForKey:cellid];
然后当你
[videoView release];
你永远不知道你是否释放了在#1或#2点获得的记忆。如果它是#2,你可能最终会在后续的电话中释放。
EmptyStack解决方案可以解决您的问题。在实施时,还要注意释放你所做的分配#1。