Нужен ли dealloc контроллер представления subview, добавленный через addSubiew? - PullRequest
0 голосов
/ 13 февраля 2012

обычно, когда я использую viewcontroller, который будет выталкивать текущий viewcontroller из пути, я использую UINavigationController и помещаю / извлекаю новые viewcontrollers и позволяю им обрабатывать все dealloc самостоятельно.

Однако, например, в этом случае у меня есть MainViewController, который является представлением по умолчанию при запуске приложения. У меня есть второе представление, называемое SecondaryViewController, всплывающее окно на главном экране (вроде лайтбокса).

Вот код для иллюстрации:

//From within mainViewController:
secondaryViewController = [SecondaryViewController alloc] initWithNibName:@"SecondaryViewController" bundle:nil]; 
[self.view addSubview:secondaryViewController.view];

Интерфейс secondViewController выглядит следующим образом:

//interface
@interface SecondaryViewController : UIViewController
{
    IBOutlet UILabel *httpLabel;
    IBOutlet UIScrollView *scrollView;
}
@property(retain, nonatomic) IBOutlet UILabel *httpLabel;
@property(retain, nonatomic) IBOutlet UIScrollView *scrollView;

Что касается реализации, у меня есть @synthesize для @property ivars, но я не делаю никаких ручных распределений. Однако я применил метод dealloc:

- (void)dealloc
{
    [httpLabel release];
    [scrollView release];
    [super dealloc];
}

Но я не уверен, что мне нужно выше.

Так что мои вопросы будут следующими:

1) Нужен ли вышеуказанный метод dealloc в этом случае? Или, вообще, когда подпредставлению понадобится метод dealloc?

2) Если мне это нужно или не нужно, зависит ли это от того, добавляю ли я дополнительныйViewController через addSubview или pushViewController? Например, если я хочу заменить весь mainViewController следующим образом:

[self.navigationController pushViewController:secondaryViewController animated:NO]

Нужен ли вторичному контроллеру элемент метода dealloc?

Спасибо!

Ответы [ 3 ]

1 голос
/ 13 февраля 2012

Я думаю, что это разрешено в последней версии iOS 5+, но ранее вы не должны были добавлять другое представление viewcontrollers в ваш основной viewcontroller. Это явное неправильное использование и может привести к проблемам.

Концепция viewcontroller - это тот, кто контролирует все виды. Контроллер представления не должен управлять другим контроллером представления, если это не контейнерный контроллер представления, такой как UINavigationController / UITabBarController.

Поэтому, пожалуйста, переосмыслите дизайн. зачем вам нужен SecondaryViewController. Почему основной контроллер также не может управлять дополнительным представлением?

И, наконец, каждый viewcontroller должен иметь в своем арсенале.

1 голос
/ 13 февраля 2012

Да, в этом случае вам нужен именно такой метод dealloc, как у вас.Вы на правильном пути, потому что вы предполагаете, что, поскольку вы не выполняете никакого ручного распределения, вам не нужно делать какие-либо сделки / освобождение ... однако, указав свойство как (retain, nonatomic), вынеявное сохранение.

Это означает, что если вы когда-либо устанавливаете эти свойства, то, что на самом деле происходит под покровом, выглядит примерно так:

-(void)setHttpLabel:(UILabel *)newlabel
{
  if (newLabel != httpLabel)
  {
    [httpLabel release];
    httpLabel = [newLabel retain];
  }
}

Как вы можете видеть, ваш синтез вызываетсохранить, чтобы произойти на объекте.Если вы никогда не уравновешиваете то, что удерживаете, с выпуском, оно протечет.Так что единственное логичное место для этого - метод dealloc.Это создает круг жизни.

Если вы никогда не устанавливаете эти свойства и не имеете release в dealloc, то это ничего не утечет, но вы, очевидно, не захотите делать такие предположения.

Если у вас не было никаких сохраняющих свойств или какого-либо ручного выделения иваров, тогда и только тогда вы можете обнулить метод dealloc.

Надеюсь, что это поможет.

0 голосов
/ 13 февраля 2012

Если вам нужно получить доступ к secondaryViewController из контроллера основного представления после того, как вы добавили его представление в иерархию, вам не следует освобождать его в этот момент.Если вам не нужен доступ к дополнительному контроллеру после того, как вы его отобразили, вы можете освободить его в этот момент.

На практике, если secondaryViewController - это ивар, вероятно, имеет смысл сохранитьсохраненная ссылка на это.Если это локальная переменная, и вы не обращаетесь к ней позже, вы должны освободить ее.

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