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

В моем корневом представлении у меня есть табличное представление с тремя строками. Когда я нажимаю на любую строку, она представляет новый вид, а затем я могу нажать кнопку назад, которая автоматически создается моим навигационным контроллером. Моя проблема возникает, когда я пытаюсь щелкнуть строку, которая уже была выбрана ранее. Я получаю сообщение об ошибке EXC BAD ACCESS. Я думаю, что это весь необходимый код:

 - (void)dealloc
 {
     self.rowChosenArray = nil;
     self.rootChoicesArray = nil;
     self.customImage = nil;
     self.rootTableView = nil;
     [super dealloc];
 }

 - (void)viewDidLoad
{

    [super viewDidLoad];

    self.rootChoicesArray = [[[NSMutableArray alloc] initWithObjects:@"",@"See Today's  Deals!", @"My Purchased Deals", @"Personal Settings", nil] autorelease];

    self.rowChosenArray = [[[NSMutableArray alloc] initWithObjects:@"", nil] autorelease];

    DealsViewController *dealsViewController = [[DealsViewController alloc] initWithNibName:@"DealsViewController" bundle:nil];
    [self.rowChosenArray addObject:dealsViewController];
    [dealsViewController release];

    PurchasedDealsViewController *purchasedDealsViewController = [[PurchasedDealsViewController alloc] initWithNibName:@"PurchasedDealsViewController" bundle:nil];
    [self.rowChosenArray addObject:purchasedDealsViewController];
    [purchasedDealsViewController release];

    SettingsViewController *settingsViewController = [[SettingsViewController alloc] initWithNibName:@"SettingsViewController" bundle:nil];
    [self.rowChosenArray addObject:settingsViewController];
    [settingsViewController release];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIViewController *targetViewController = [rowChosenArray objectAtIndex: indexPath.row];
[[self navigationController] pushViewController:targetViewController animated:YES];
[targetViewController release];
}

Я до сих пор не знаю, где / когда выпускать / устанавливать объекты в nil (все четыре моих объекта имеют свойство retain в заголовочном файле.

Заранее спасибо за помощь, дайте мне знать, если вам что-то еще понадобится.

Ответы [ 3 ]

1 голос
/ 04 декабря 2011

Вы перепродаваете targetViewController в tableView:didSelectRowAtIndexPath:.Вы получаете несобственную ссылку через objectAtIndex: (что означает, что вы не несете ответственности за эту ссылку) и не можете отозвать эту ссылку.Так что просто удалите [targetViewController release]; и все в порядке.

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

  • начинается или начинается с alloc, copy или mutableCopy
  • начинается с new
1 голос
/ 04 декабря 2011
  1. Прежде чем добавить элемент в массив, вы выделяете его, но освобождаете его, как только он добавлен - так что утечки нет;
  2. Вам никогда не нужно освобождать элементы в массиве, потому что они будут освобождены в тот момент, когда вы освобождаете сам массив.
0 голосов
/ 04 декабря 2011

также у вас есть некоторые утечки здесь, если вы сохраняете в viewDidLoad, вы должны выпустить / ноль в viewDidUnload и в dealloc

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