应用程序因错误而崩溃:修改正在完成的层

时间:2011-09-06 08:22:34

标签: objective-c ios subview

滚动浏览桌面视图后,我的应用程序崩溃了“修改正在最终确定的图层”消息。

我认为错误是因为我在方法结束时发布了'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;
}

2 个答案:

答案 0 :(得分:2)

错误是由于行,

if([self.webViewCache objectForKey:cellid])
{
    videoView=[self.webViewCache objectForKey:cellid];
}

这里您只是从字典中获取Web视图,这显然会返回一个autoreleased对象。因此,当您尝试释放它时(不知道它是已分配还是仅从字典中获取),就会发生错误。

一个解决方案是retain videoView

videoView=[[self.webViewCache objectForKey:cellid] retain];

答案 1 :(得分:1)

  1. 您正在分配

    UIWebView *videoView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 104, 104)];
    
  2. 然后,您可以将此引用替换为

    中的其他内容
    videoView=[self.webViewCache objectForKey:cellid];
    
  3. 然后当你

    [videoView release];
    
  4. 你永远不知道你是否释放了在#1或#2点获得的记忆。如果它是#2,你可能最终会在后续的电话中释放。

    EmptyStack解决方案可以解决您的问题。在实施时,还要注意释放你所做的分配#1。