0

У меня есть пользовательский ViewController, который является переменной экземпляра моего корневого viewController.ViewControllers как переменные экземпляра

Я намерен представить его при каждом нажатии кнопки. Поэтому viewController будет представлен и отклонен потенциально много раз.

Я, очевидно, хочу только выделить init экземпляр переменной один раз, когда модальный viewController не освобождается каждый раз, когда он уволен, поэтому должен ли я иметь такой код внутри действия моей кнопки, чтобы убедиться, что он только назначает и вводит один раз ?:

if(!myViewController) 
{ 
    ViewController *myViewController = [[ViewController alloc] init]; 
} 
[self presentViewController:myViewController animated:YES completion:NULL]; 
+0

Я думаю, вы имели в виду, что модальный контроллер * * нераспределен, не так ли? –

ответ

3

Я обычно использую ленивый instatiation в тех случаях:

Объявите свойство для ViewController:

@property(nonatomic, strong) UIViewController *myViewController; 

После этого вы можете переопределить ГЭТ из myViewController

-(UIViewController*) myViewController { 
    if(!_myViewController) { 
     _myViewController = [[UIViewController alloc] init]; 
    } 

    return _myViewController; 
} 

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

ВНИМАНИЕ

Это хорошо работает, если вы всегда используете self.myViewController. Я считаю хорошей практикой, что генерируемые свойства iVars должны быть доступны только в своих сеттерах/геттерах.

+0

Тогда вам нужно использовать «self.myViewController», чтобы использовать getter! –

+0

Мысль это было очевидно, но вы правы. Я только что добавил эту заметку. Спасибо за это @ Geraud.ch –

+0

@TiagoAlmeida Спасибо, Итак, в контроллере rootView у меня нет инструкции If, я просто всегда назначаю init правильно? Тогда метод init контроллера модального представления определяет, если он уже создан? – Woodstock

0

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

if(myViewController) { 
    [myViewController release]; 
    myViewController = nil; 
} 

myViewController = [[ViewController alloc] init]; 

[self presentViewController:myViewController animated:YES completion:NULL]; 

Вам нужно сделать myViewController в качестве переменной класса.

+0

Почему это должна быть переменная класса? Будет ли переменная экземпляра (aka ivar) лучше не соответствовать вашему коду? – Monolo

+0

Идея состоит в том, чтобы сохранить один экземпляр VC, который хорош для повышения производительности. В вашем случае вы удаляете «старый» VC и создаете новый. Будьте осторожны, этот код не соответствует требованиям дуги. –

+0

Мы должны сделать myViewController переменной класса, чтобы мы могли освободить объект до выделения памяти. Так что мы имеем только один экземпляр, активный одновременно. Geraud.ch прав. Это не ARC-код. Я предлагал метод, чтобы только один экземпляр был активен одновременно – PgmFreek

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