Случайная отладка / неправильное управление памятью - PullRequest
0 голосов
/ 11 сентября 2011

Понятия не имею, что не так с моей программой ...

Мне кажется, что с управлением памятью что-то плохое, потому что каждый раз, когда я пытаюсь запустить приложение, у меня результат, отличный от симулятора.

Когда я запускаю приложение, все работает нормально. Форматер даты работает отлично! Я вижу в таблице все ячейки, отформатированные правильно!

Интерфейс представляет собой tabController с 2 tableView для отображения содержимого базы данных и вкладку с представлением, используемым для добавления элемента в базу данных.

Если я захожу в «Добавить вкладку», я могу добавить все элементы, которые я хочу, но когда я переключаюсь обратно на вкладку «Другие», происходит сбой программы с «Exe_Bad_Access» (в коде ниже).

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

UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"MovieTableCell" owner:self options:NULL];
    cell = nibLoadedCell;
}

// Configure the cell.
UILabel *itemLabel = (UILabel *) [cell viewWithTag:1];
UILabel *priceLabel = (UILabel *) [cell viewWithTag:2];
UILabel *groupLabel = (UILabel *) [cell viewWithTag:3];
UILabel *dateLabel = (UILabel *) [cell viewWithTag:4];


NSDictionary *rowVals = (NSDictionary *) [shoppingListItems objectAtIndex:indexPath.row];
NSString *itemName = (NSString *) [rowVals objectForKey:@"item"];
itemLabel.text = itemName;

int groupid = [(NSNumber *) [rowVals objectForKey:@"groupid"] intValue];
groupLabel.text = Group[groupid];

NSNumber *price = (NSNumber *) [rowVals objectForKey:@"price"];
priceLabel.text = [priceFormatter stringFromNumber: price];


NSDate *dateValue = (NSDate *) [rowVals objectForKey:@"dateadded"];
NSString *str = [dateFormatter stringFromDate:dateValue]; //-->Here I got the Bad Access
[dateLabel setText:str];

return cell;

[itemLabel release];
[groupLabel release];
[priceLabel release];
[dateLabel release];
}

Вот вся программа, если кто-то хочет посмотреть: http://cl.ly/A1yk

Ответы [ 5 ]

1 голос
/ 12 сентября 2011

3 вещи:

1) Ничего после вашего оператора return не будет выполнено. 4 строки после этого никогда не запустятся.

return cell;

[itemLabel release];
[groupLabel release];
[priceLabel release];
[dateLabel release];

2) Если эти операторы релиза действительно выполнялись, при следующем доступе к этим меткам вы получите ошибку неверного доступа, потому что эти UILabels будут освобождены. Не вызывайте «release» для любого объекта, для которого вы не называли «retain».

3) Чтобы понять, если что-то не так с dateFormatter , нам нужно увидеть каждый фрагмент кода, который касается этой переменной.

1 голос
/ 11 сентября 2011

Посмотрите на управление памятью dateFormatter.Это может быть переиздан.Вы можете проверить, добавив

NSLog(@"Date formatter: %@", dateFormatter);

перед вызовом строки и посмотреть, что появляется.

Кстати, удалите строки [itemLabel release] и т. Д.(а) они не исполняются, поскольку они следуют вашим return cell, и (б) если бы они были вызваны, они вызовут проблемы.

0 голосов
/ 13 сентября 2011

Я не могу быть уверен, что это может быть причиной, потому что exc_bad_access может произойти для чего угодно.Но, похоже, когда вы повторно используете одну и ту же ячейку, вы никогда не выделяете ее самостоятельно, а вместо этого получаете ее как nibloaded-ячейку от разработчика интерфейса.

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

  • (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {статическая NSString * cellIdentifier = @ "MyCell";

    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: cellIdentifier];if (cell == nil) {cell = [[[UITableViewCell alloc] initWithFrame: CGRectZero reuseIdentifier: cellIdentifier] autorelease];cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;} cell.text = label;

    return cell;}

0 голосов
/ 11 сентября 2011

Попробуйте удалить разделительные линии в конце.Поскольку вы не выделяете UILabel, лучше не выпускать их.Надеюсь, это поможет!

0 голосов
/ 11 сентября 2011

Ваше приведение NSDate к objectAtIndex, вы уверены, что объект не какого-то другого класса?Кроме того, инициализируется ли переменная dateFormatter так, как это может быть ноль?

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