Нажимаем подробный вид - PullRequest
       5

Нажимаем подробный вид

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

У меня есть tableView, связанный с таблицей базы данных.Когда я нажимаю на строку, я нажимаю на вид со всеми деталями элемента.Все отлично работает.

Это код в основном классе:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailsViewController *detailViewController = [[DetailsViewController alloc] initWithNibName:@"DetailsViewController" bundle:nil];

    NSDictionary *rowVals = (NSDictionary *) [shoppingListItems objectAtIndex:indexPath.row];

    NSString *titleString = [(NSString *) [rowVals objectForKey:@"item"] autorelease];
    NSString *category = [(NSString *) [rowVals objectForKey:@"groupid"] autorelease];
    NSNumber *priceNumber = [(NSNumber *) [rowVals objectForKey:@"price"] autorelease];
    NSString *priceString = [[priceFormatter stringFromNumber: priceNumber] autorelease];
    NSDate *date = [(NSDate *) [rowVals objectForKey:@"dateadded"] autorelease];
    NSString *dateString = [[dateFormatter stringFromDate:date] autorelease];
    NSNumber *IO = [(NSNumber *) [rowVals objectForKey:@"incout"] autorelease];

    detailViewController.stringTitle = titleString;
    detailViewController.categoryVar = category;
    detailViewController.priceVar = priceString;
    detailViewController.dateVar = dateString;
    detailViewController.IOVar = IO;

    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
}

и это в DetailsViewController.m

- (void)viewDidLoad {    
    [super viewDidLoad];
    self.navigationItem.title = stringTitle;
    nome.text = stringTitle;
    prezzo.text = priceVar;
    data.text = dateVar;
    if ([IOVar isEqualToNumber:[NSNumber numberWithInt:1]]) {
        categoria.hidden = NO;
        categoriaLabel.hidden = NO;
        photoLabel.hidden = NO;
        categoria.text = categoryVar;
    } else if ([IOVar isEqualToNumber:[NSNumber numberWithInt:0]]){
        categoria.hidden = YES;
        categoriaLabel.hidden = YES;
        photoLabel.hidden = YES;
        categoria.text = @"";
    }
}

Если я нажму и уйдуназад более 3 раз мое приложение зависало с EXC_BAD_ACCESS в main.m

Спасибо, если вы читали до здесь, и извините за мой плохой английский.

Ответы [ 3 ]

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

Это определенно звучит так, как будто вы чрезмерно отпускаете объект (он же «зомби»).

Xcode Instruments - отличный инструмент для выслеживания зомби.

Прочтите об этом здесьи попробуйте.

http://www.markj.net/iphone-memory-debug-nszombie/

Это гораздо веселее, чем убивать зомби в Call of Duty; -)

Удачи!

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

Вам не нужно автоматически высвобождать значения, которые вы получаете из словаря, потому что вы не являетесь их владельцем. Основные правила управления памятью : Вы являетесь владельцем объекта, если создаете его с помощью метода, имя которого начинается с «alloc», «new», «copy» или «mutableCopy», или если вы переходите во владение сохраняя его.

В вашем случае код должен быть:

detailViewController.stringTitle = [rowVals objectForKey:@"item"];

и т.д.

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

Возможно, вы перевыпускаете свои переменные.Вы извлекаете ivars для вашего контроллера данных из словаря из массива.После того, как вы назначите их строке, вы автоматически освободите их.Я думаю, что это проблема.Вы очищаете массив данных.Когда вы запрашиваете его при более позднем выборе строки, вы пытаетесь получить доступ к объектам массива или словаря, которые больше не существуют -> EXC_BAD_ACCESS.

...