Сбой приложения из-за ошибки: изменение слоя, который завершается

Мое приложение падает с сообщением «изменение слоя, который завершается» после прокрутки таблицы.

Я считаю, что ошибка связана с тем, что я выпустил «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;
}

person Zhen    schedule 06.09.2011    source источник


Ответы (2)


Ошибка из-за строки,

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

Здесь вы просто получаете веб-представление из словаря, который, очевидно, возвращает объект autoreleased. Итак, когда вы пытаетесь освободить его (не зная, был ли он выделен или только что получен из словаря), возникает ошибка.

Одним из решений было бы retain videoView.

videoView=[[self.webViewCache objectForKey:cellid] retain];
person EmptyStack    schedule 06.09.2011

  1. Вы выделяете

    UIWebView *videoView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 104, 104)];
    
  2. Затем вы можете заменить эту ссылку на что-то другое из

    videoView=[self.webViewCache objectForKey:cellid];
    
  3. Затем, когда вы

    [videoView release];
    

вы никогда не знаете, освобождаете ли вы память, полученную в пункте № 1 или № 2. Если это # ​​2, вы можете в конечном итоге освободиться при последующих вызовах.

Решение EmptyStack может решить вашу проблему. При его реализации также позаботьтесь об освобождении распределения, которое вы сделали в пункте № 1.

person Saran    schedule 06.09.2011