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

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

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

2 голосов
/ 06 сентября 2011

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

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

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

Одним из решений будет retain videoView.

videoView=[[self.webViewCache objectForKey:cellid] retain];
1 голос
/ 06 сентября 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.

...