2010-09-07 2 views
0

Недавно я присоединился к двум проектам Xcode. Чтобы заставить эту работу работать, мне пришлось выделить и инициализировать мой контроллер.Когда нужно было назначить и инициализировать контроллер вида

self.myViewController = [[MyViewController alloc] init]; 

Но почему? В другом проекте у меня такой же код. Единственное различие заключается в иерархии различных представлений. Я добавил новый вид в начало (начало). Таким образом, вызывающий контроллер просмотра уже не первый вид в стеке.

я выдвигаю свою точку зрения таким образом, в стеке:

[[self navigationController] pushViewController:myViewController animated:YES]; 

В моем NIBS я добавил объект View Controller с IB и соединил Outlets.

И у меня есть вопрос управления тоже: Если у меня есть свойство, например myViewController, нужно ли его выпустить? «Нормальный» выпуск выполняется в методе dealloc. Но нужно ли использовать дополнительный выпуск из-за выделения? Я так не думаю, но я все равно прошу вас.

ответ

0

Мне нужно было бы увидеть больше кода, чтобы ответить, почему вам нужно было назначить контроллер своего вида, но я бы сказал, что вы всегда выделяете их вручную (по крайней мере, в моем опыте).

Что касается вопроса управления памятью, если ваше свойство объявлено как свойство retain (@property(retain) UIViewController *myViewController), вы действительно теряете память, так как счетчик удержания после выделения будет 1, а после того, как удержание, сделанное вашим аксессуаром, будет 2. Следовательно, если вы отпустите его только один раз, вы получите утечку.

Я обычно делаю это вместо:

self.myViewController = [[[MyViewController alloc] init] autorelease]; 
+1

Спасибо за ваш ответ! Больше нет кода. Я делаю это полностью с IB, потому что меня смутило использование arrayWithObject: viewControllers/pushViewController/addSubView/initWithNibName ... Так что либо выпуская его два раза, либо используя autorelease? – testing

0

Я выяснил: в IB мне пришлось установить имя ниба на моем объекте контроллера вида. Итак, выделение и инициализация выполняется IB?

0

Существует еще один вариант:

(IBAction)loginButton:(UIButton *)sender { 
    NSLog(@"pressed login"); 
    ICMasterViewController *controller = [[self storyboard] instantiateViewControllerWithIdentifier:@"mainnav"]; 
    [self presentViewController:controller animated:YES completion:nil]; 
} 

На раскадровке вы должны UIViewController с именем mainnav

Смежные вопросы