Освобождение статического объекта - PullRequest
0 голосов
/ 02 августа 2010

Я знаю, что в большинстве случаев мне не нужно выпускать статические переменные.Однако следующий код для моей модели:

+ (UIImage*)imageForTag
{
    static UIImage *imgTag;

    if(imgTag == nil)
    {
        NSString* imageName = [[NSBundle mainBundle]
                           pathForResource:@"tag" ofType:@"png"];
        imgTag = [[[UIImage alloc]
                           initWithContentsOfFile:imageName] autorelease];
    }
    return imgTag;
}

, а вот моя часть таблицы данных

- (UITableViewCell *)tableView:(UITableView *)tableView
                  cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView
                     dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc]
                               initWithStyle:UITableViewCellStyleDefault
                               reuseIdentifier:CellIdentifier] autorelease];
    }

    if (indexPath.row == 0) 
    {
        cell.imageView.image = [DataModel imageForSmtng];
    }
    else if(indexPath.row == 1)
    {
        cell.imageView.image = [DataModel imageForTag];
    }

    return cell;

Это произойдет сбой cell.imageView.image = [DataModel imageForTag] во второй раз из-за imageForTagуказывая на неверный адрес.Если я добавлю сохранение на том, что это не будет падать.Разве нельзя удалить авто-релиз сверху и забыть о imgTag ссылках?

1 Ответ

1 голос
/ 02 августа 2010

Это неправильно.Потому что когда вы вызываете autorelease для переменной imgTag, вы просто освобождаете объект, на который она указывает.Но переменная imgTag по-прежнему указывает на этот диапазон памяти.Таким образом, когда вы снова вызываете imgTag, он не равен nil, он все равно указывает на что-то, недопустимая вещь.

Итак, решение должно быть либо:

1 / Вы не должныотпустить его вообще

2 / Вы должны отпустить его вручную, когда считаете, что сейчас самое время его выпустить.И затем не забудьте сделать: imgTag = nil

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...