iPhone dev - viewDidLoad и viewDidUnload в программно созданном представлении? - PullRequest
1 голос
/ 02 июня 2010

Я где-то читал, что в программно созданном представлении в UIViewController, не использующем Interface Builder, -viewDidLoad и -viewDidUnload не должны использоваться. Это правильно? Зачем? Где я могу опубликовать подпредставления, свойства которых у меня есть? Или мне просто не использовать свойства для них?

РЕДАКТИРОВАТЬ : Прочтите мои комментарии к ответу Роба Нейпира.

Ответы [ 2 ]

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

Странная вещь в том, что UIViewController, не загруженный из файла NIB, не уведомляется о выгрузке его представления (и поэтому его метод viewDidUnload не вызывается), если вы не предложите базовую реализацию метода loadView, например:

- (void)loadView {
   self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds] autorelease];
   [self.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
}

- (void)viewDidLoad {
   [super viewDidLoad];
   // create views...
}


- (void)viewDidUnload {
   // destroy views...
   [super viewDidUnload];
}

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

Значит, Робс прав.

0 голосов
/ 02 июня 2010

Создайте свои подпредставления в -viewDidLoad. Если вам нужны ивары для них, присвойте только их значения. Ссылка удерживается путем добавления видов в качестве подпредставлений к основному виду.

Затем, когда ваш вид не загружен, вы должны установить свои ivars на ноль, потому что объект был освобожден, так как ваш вид был удален и освобожден.

Так в вашем заголовке

@interface MyViewController : UIViewController {
  IBOutlet UIView *someSubview; // assigned
}
@property (nonatomic, assign) IBOutlet UIView someSubview;
@end

А в твоей реализации

@implementation MyViewController
//... some important stuff

- (void)viewDidLoad;
{
  [super viewDidLoad];
  someSubview = [[UIView alloc] initWithFrame:self.view.bounds];
  [self.view addSubview:someSubview]; // retains someSubview
  [someSubview release];   // we don't hold it
}

- (void)viewDidUnload;
{
  [super viewDidUnload];
  someSubview = nil;  // set the pointer to nil because someSubview has been released
}

//... more important stuff

@end

Если вы хотите, вы также не можете выпустить someSubview в -viewDidLoad, но затем вы должны выпустить его в -viewDidUnload И -dealloc, поскольку (если я правильно помню) -viewDidUnload не вызывался раньше -dealloc. Но это не обязательно, если вы не сохраните someSubview.

...