Как я могу освободить и выпустить эти переменные в Objective C? - PullRequest
0 голосов
/ 07 октября 2011

Пожалуйста, смотрите следующий код, я хочу знать, как я могу отменить выделение ячейки .Из того, что я понял, должен быть de-alloc для каждого alloc и release для каждого retain.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"UITableViewCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc]
                 initWithStyle: UITableViewCellStyleSubtitle
                 reuseIdentifier: CellIdentifier] autorelease];
    }
    cell.textLabel.text = [dataArray objectAtIndex:indexPath.row];    return cell;
}

и из приведенного ниже кода я правильно делаю de-allocate dataArray или должен быть релиз или оба.
Интерфейс

@interface myViewController : UIViewController
{
    NSArray *dataArray;
}

@property(retain,nonatomic) NSArray *dataArray;
@end

Из реализации

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.dataArray=[[NSArray alloc] initWithObjects:@"XXX",@"YYY",@"ZZZ",nil];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    [self.dataArray dealloc];
}

Ответы [ 3 ]

3 голосов
/ 07 октября 2011

Из того, что я понял, должно быть удаление для каждого выделения и освобождение для каждого удержания.

Вы неправильно поняли.Должно быть освобождение для каждого сохранения, но вы не должны / не должны явно освобождать что-либо.

Когда вам нужен объект, вы должны сохранить его (а [[XX alloc] init] выполняет первоначальное сохранение для вас).).Когда вам больше не нужен объект, вы должны освободить удержание, которое у вас есть на нем.

Это простые правила.Там не так много мелкого шрифта, но есть ряд особенностей языка, которые помогут вам выполнить правила, и несколько «хитростей ремесла», которые нужно изучить (прежде всего, как работает «автоматический выпуск»).

2 голосов
/ 07 октября 2011

В вашем примере выделенная ячейка будет автоматически освобождена, потому что вы отправили объекту сообщение автоматического освобождения.Так что вам не нужно беспокоиться об освобождении памяти - это произойдет автоматически.

Что касается вашего второго вопроса, в общем, вам не следует звонить напрямую в dealloc.Система вызывает Deloc для вас, когда количество сохраняемых объектов становится равным нулю.Вы должны прочитать следующую статью, которая хорошо объясняет управление памятью в очень ясной форме: http://interfacelab.com/objective-c-memory-management-for-lazy-people/.

У определенного кода, который вы разместили, есть две проблемы.Во-первых, исходя из того, что я сказал выше, dealloc следует заменить вызовом release.Во-вторых, у вас действительно есть утечка памяти: когда вы выделяете объект dataArray, он получает счетчик сохранения 1. Но вы назначаете его свойству, определенному с помощью атрибута «retain».Таким образом, установщик этого свойства снова сохранит объект, увеличив его счетчик до 2. Когда вы, наконец, отпустите, он вернется к 1, но не к нулю, поэтому он не будет освобожден.

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

dataArray = [[NSArray alloc] initWithObjects:@"XXX",@"YYY",@"ZZZ",nil];

Если вы явно дали переменной экземпляра имя при синтезировании свойства (выполнив что-то вроде @synthesize dataArray = _dataArray, затем используйте это имя.

Другой вариант, который у вас есть, это не выделять / инициализировать массив, а использовать метод класса arrayWithObjects в NSArray . Объект, который вы получите от этого, будетавтоматически выпущен, так что вам не нужно беспокоиться об управлении им.

0 голосов
/ 07 октября 2011

В первом случае вам не нужно беспокоиться об освобождении этой ячейки, потому что она будет освобождена TableView, а tableView действительно сохраняет только фиксированное небольшое количество ячеек, которые используются каждый раз.

для второго примера просто используйте вспомогательный метод, который возвращает автоматически освобожденный объект:

self.dataArray = [NSArray initwithObject:myObject];

, так как вы используете установщик сохранения, счетчик хранения будет равен 1 в конце, и это должно быть сброшено в методе dealloc следующим образом:

- (void) dealloc
{
    [dataArray release];
    [super dealloc];
}

Вы не должны вызывать dealloc непосредственно в viewDidUnload, что вам нужно сделать для любого сохраненного подпредставления mainView, освободить его с помощью установщика следующим образом:

self.myView = nil;

Это освободит предыдущее значение и укажет на ноль.

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