цель C Невозможно выпустить UIViewController - PullRequest
0 голосов
/ 04 марта 2011

У меня есть подкласс UIViewController, также реализующий UITableViewDelegate.
По сути, отображается UITableView, и выбор ячейки выдвигает новое представление.
Вот как выглядит код:

// NavigationContentsViewController.h
@interface NavigationContentsViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {

    IBOutlet UITableView * newsTable;
    UIActivityIndicatorView * activityIndicator;
}

///////////////////////////////////////////////////////////////////////
// placed in NavigationContentsViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSInteger selectedCellItem = indexPath.row;

    TableViewController *fvController = [[TableViewController alloc] initWithNibName:@"TableViewController" bundle:[NSBundle mainBundle]];
    fvController.selectedCellItem = selectedCellItem;
    fvController.link = [links objectAtIndex:selectedCellItem];
    [self.navigationController pushViewController:fvController animated:YES];
    [fvController release];  // #1 if removed everything works fine but getting a leak
    fvController = nil;      // #2
}
///////////////////////////////////////////////////////////////
//  TableViewController.h
@interface TableViewController : UIViewController <UIWebViewDelegate>{
    NSInteger selectedCellItem;
    IBOutlet UIWebView *myWebView;
    NSString *link;
    UIActivityIndicatorView *activityIndicator;
}

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

Моя проблема заключается в том, что если пользователь решит вернуться из веб-представления к предыдущему представлению (тому, которое содержит таблицу) до того, как веб-просмотр завершит загрузку, приложение вылетает, получая эту ошибку: "[TableViewController responsedsToSelector:]: сообщение отправлено на освобожденный экземпляр 0x4b57460 "

Если загрузка веб-представления завершена и пользователь выбирает возврат, все в порядке.

Мне удалось решить эту проблему, удалив две строки, помеченные # 1 и # 2 в коде, но затем я получил утечку памяти (поскольку я не освобождаю TableViewController).

* 1014Все еще пытаюсь понять, что происходит.Есть идеи?Заранее спасибо.

1 Ответ

4 голосов
/ 04 марта 2011

Я подозреваю, что вы устанавливаете свой TableViewController в качестве делегата для UIWebView, и вы пропустили это сообщение в документации :

Важно: Довыпуская экземпляр UIWebView, для которого вы установили делегат, вы должны сначала установить его свойство делегата на nil.Это можно сделать, например, в вашем методе dealloc.

Если вы забудете удалить делегата в dealloc, веб-представление может в итоге попытаться отправить сообщение делегата, даже если делегат больше не существует.,Boom.

...