CellForRowAtIndexPath Вызывая проблемы, когда я могу выпустить локальный внутри? - PullRequest
1 голос
/ 01 марта 2010

У меня есть UITableView, который отображает различные строки из пользовательского объекта, называемого «Транзакция». в CellForRowAtIndexPath он выделяет новый экземпляр транзакции, а затем копирует значения из конкретной транзакции, которая находится в массиве делегатов, чтобы я мог получить к нему доступ из разных представлений. Затем он использует новую транзакцию 'copy' и ее свойства для заполнения ячейки таблицы. Проблема в том, что я освобождаю скопированный объект транзакции при повторном отображении таблицы, в которой происходит сбой приложения. если я закомментирую релиз, программа будет работать хорошо, но я, очевидно, беспокоюсь об управлении памятью. Мой вопрос: какого черта я должен делать, есть ли другое место, чтобы выпустить это?

Вот код:

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

static NSString *CellIdentifier = @"TransCell";

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

// Set up the cell...
NSUInteger row = [indexPath row];
CashAppDelegate *mainDelegate = [(CashAppDelegate *) [UIApplication sharedApplication] delegate];


Transaction *cellTrans = [[Transaction alloc] init];


cellTrans = [mainDelegate.transactionArray objectAtIndex:row];

NSString *string = [NSString stringWithFormat:@"$%1.2f %@ | %@", cellTrans.amount, cellTrans.category, cellTrans.descriptionString];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

cell.text = string;
//[cellTrans release];
return cell;
}

Ответы [ 2 ]

2 голосов
/ 01 марта 2010

На самом деле вам не нужно выделять новый объект Transaction, поскольку вы хотите / нуждаетесь в ссылке на объект, уже существующий в вашем массиве транзакций делегата. Так что вместо:

Transaction *cellTrans = [[Transaction alloc] init];
cellTrans = [mainDelegate.transactionArray objectAtIndex:row];

и приведение в порядок

[cellTrans release];

просто получите ссылку с этой одной строкой:

Transaction *cellTrans = (Transaction *)[mainDelegate.transactionArray objectAtIndex:row];
2 голосов
/ 01 марта 2010

Вы хотите:

Transaction *cellTrans = [mainDelegate.transactionArray objectAtIndex:row];

вместо:

Transaction *cellTrans = [[Transaction alloc] init];


cellTrans = [mainDelegate.transactionArray objectAtIndex:row];

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

...