0

Каждый раз, когда я представляю свою новую ViewController (как собственность в ведущий Vc), как показано на рисунке ниже:Каков правильный способ использования ARC при наличии viewcontroller?

if(self.viewController) [self.viewController release]; 
self.viewController = [[ViewController alloc] init]; 
[self presentModalViewController:self.viewController animated:YES]; 

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

Но теперь я использую ARC и не имею какие-либо идей, как отправить свое сообщение об освобождении объекта (потому что не работает с ARC)

Может ли вы помочь мне с этими вопросами?

PS: Каждый раз, когда я представляю игруVC, мне нужен новый экземпляр объекта.

Спасибо всем!

+1

Вы (как правило) не нужно отправлять сообщения о выпуске в объекты с ARC. Компилятор Apple будет размещать сообщения выпуска в вашем коде при компиляции всякий раз, когда это уместно. –

+2

Это должно читать «Вы * не можете * отправлять сообщения выпуска на свои объекты с помощью ARC». – mattjgalloway

ответ

2
self.viewController = [[ViewController alloc] init]; 
[self presentModalViewController:self.viewController animated:YES]; 

приведенных выше код будет всегда представляет новый ВЕ и компилятор яблока будет заботиться об освобождении.

Но если вы думаете, что выше есть некоторые проблемы (что миф), то вы можете сделать также, как этот

self.viewController = nil; 
self.viewController = [[ViewController alloc] init]; 
[self presentModalViewController:self.viewController animated:YES]; 
+0

У меня есть несколько вопросов: мой ведущий vc является singleton, и когда я закончил использовать свой viewController (представленный), я вызываю метод в singleton vc (presenter) и хочу отклонить представленный vc в этом методе. поэтому, например, vc A представляет B., используя B некоторое время. Например, я заканчиваю использовать B vc и хочу снова создать B. В A vc я вызываю метод [B rejectModalViewControllerAnimated: YES]; и сделать alloc и представить для B vc, но я не вижу vc. (viewDidLoad выполняется, но просмотр не отображается). –

+0

укажите другой вопрос, а также код .. попробуйте анимацию 'NO' –

+0

Ok. Спасибо за ответ в любом случае! –

0
self.viewController = [[ViewController alloc] init]; 
[self presentModalViewController:self.viewController animated:YES]; 

- правильный путь.

Однако этот код ОК, даже если вы используете Ручной подсчет ссылок, при условии, что viewController является свойством self с retain или strong флагом. Когда вы меняете значение свойства, выдается предыдущее значение свойства, поэтому вам не нужно его выпускать самостоятельно.

1

Компилятор предоставляет вам инструкцию по выпуску. Вы должны использовать только этот код, и он должен работать нормально:

self.viewController = [[ViewController alloc] init]; 
[self presentModalViewController:self.viewController animated:YES]; 
0

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

ViewController *viewController = [[ViewController alloc] init]; 
[self presentModalViewController:viewController animated:YES]; 
+0

Что делать, если он хочет ссылаться на него? Совершенно верно, чтобы держать ссылку на нее. – mattjgalloway

+0

Да, но не тогда, когда вы хотите новый объект каждый раз, когда этот код выполняется. –

+0

Но его метод * * * дает новый объект каждый раз * и * сохраняет ссылку на него. Возможно, он захочет взаимодействовать с VC, который в настоящее время представлен, например. – mattjgalloway

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