Вопрос управления памятью - PullRequest
1 голос
/ 02 апреля 2011
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *TelephoneCellId = @"TelephoneCellId";

    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:TelephoneCellId];

    UIImageView *imgView;
    UILabel *lblName;
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TelephoneCellId] autorelease];

        UIView *uiview = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 90.0)];

        imgView = [[[UIImageView alloc] initWithFrame:CGRectMake(10.0, 10.0, 60.0, 60.0)] autorelease];
        imgView.tag = IMAGE_TAG;
        [uiview addSubview:imgView];

        lblName = [[[UILabel alloc] initWithFrame:CGRectMake(80.0, 10.0, 200.0, 20.0)] autorelease];
        lblName.tag = NAME_TAG;
        [uiview addSubview:lblName];

        [cell.contentView addSubview:uiview];
        [uiview release];
    } else {
        imgView = (UIImageView *)[cell.contentView viewWithTag:IMAGE_TAG];
        lblName = (UILabel *)[cell.contentView viewWithTag:NAME_TAG];
    }

    NSDictionary *dict = [[[self.telephoneList objectForKey:[self.keys objectAtIndex:[indexPath section]]] objectAtIndex:[indexPath row]] retain];
    imgView.image = [UIImage imageNamed:[dict objectForKey:@"image"]];

    lblName.text = [dict objectForKey:@"name"];

    [dict release];
    return cell;
}

В приведенном выше коде у меня возник вопрос о сохранении и авто-освобождении.Если UITableViewCell, возвращаемый из очереди, равен нулю, то я должен сделать новый.При этом я автоматически выпускаю метку и изображение.Затем я устанавливаю текст / изображение.Если UITableViewCell НЕ равен nil, тогда я нахожу представление по тегу, однако это вернет объект с автоматическим выпуском.Должен ли я сохранить это?Затем отпустите после завершения установки значения?Или это хорошо, потому что представление сохраняет его, так что это по крайней мере 1, поэтому его безопасно не выпускать?

Помощь в таких сценариях будет высоко цениться, поэтому подведем итог, когда можно было бы просто нестипо установке / получению значений на объекте с автоматическим освобождением?

Спасибо за ваше время:)

Ответы [ 3 ]

2 голосов
/ 02 апреля 2011

Вы слишком обдумали это.

Хотите ли вы, чтобы эта функция стала владельцем объекта (и, следовательно, ответственности за него)?Нет, конечно нет.Поэтому не сохраняйте для этой функции.

Вы хотите, чтобы контроллер представления, в котором находится этот код, взял на себя ответственность за объект?Нет: Вы хотите оставить это в руках UIKit.Поэтому, не сохраняйте ради контроллера представления.

Вывод: Если вы не хотите вступать во владение, вы не сохраняете.и позже, выпуская) словарь.Даже если он был автоматически выпущен до такой степени, что скоро исчезнет, ​​этого «скоро» не будет, пока работает эта функция.

2 голосов
/ 02 апреля 2011

Если у вас есть auto освобожденный объект, вы можете манипулировать его свойствами, передавать его в качестве аргумента другим методам и даже возвращать его как возвращаемое значение из вашего метода.Но вы не можете сохранить его в ivar, глобальной переменной или статической переменной, не сохранив ее.

Однако метка, которую вы находите по тегу, на самом деле не выпускается автоматически.Это просто объект, которым вы не владеете.Вы можете сохранить и затем освободить его, но это не обязательно.

Основные ситуации, на которые следует обратить внимание:

  • Когда вы выбираете объект из коллекции и затем удаляетеобъект из коллекции, коллекция выпустит его.Поэтому вам придется сохранить его, если вы хотите сохранить его.
  • Когда вы пишете метод сеттера, вы должны быть осторожны, чтобы разобраться со случаем, когда кто-то эффективно [object setFoo:object.foo].Если вы освободите старое значение перед сохранением нового, это может привести к отправке retain освобожденному объекту.
0 голосов
/ 02 апреля 2011

Да, нет необходимости сохранять его. Вам также не нужно сохранять и освобождать словарь.

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