Правильный шаблон управления памятью для выделения / инициализации представления, добавления в подвидение и возврата

#objective-c #ios #memory-management

#objective-c #iOS #управление памятью

Вопрос:

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

Вот код:

     PDFViewController *cv = [[PDFViewController alloc] initWithNibName:@"PDFViewController" bundle:[NSBundle mainBundle]];
cv.view.frame = CGRectMake(0, 0, 1024, 748);

    [self.view addSubview:cv.view];
  

Теперь, если я отправлю сообщение о выпуске экземпляру cv:

       [cv release];
  

Мое приложение выходит из строя. То же самое, если я добавлю его в пул авторелиза (при выделении / инициализации).
Теперь меня беспокоит следующее:

0) Я выделяю / инициализирую, поэтому моя обязанность освободить (или добавить в пул автоматического освобождения).

1) Вызов addSubview:cv.view увеличивает количество сохраненных cv.

2) Я должен иметь возможность отправить ему сообщение о выпуске, потому что оно сохраняется в self.view.

3) Что не так?

TIA.

РЕДАКТИРОВАТЬ
решение

 PDFViewController *cv = [[PDFViewController alloc] initWithNibName:@"PDFViewController" bundle:[NSBundle mainBundle]];
[self presentModalViewController:cv animated:YES];
  

Комментарии:

1. Какое сообщение вы получаете при сбое?

2. Я просто получаю ERROR_BAD_EXEC или аналогичное сообщение высокого уровня. Хотя я могу заставить это произойти, добавив [cv release]; определенно.

Ответ №1:

Вызов addSubview:cv.view не увеличивает количество сохранений объекта cv. Это увеличивает количество сохраненных в «cv.view», поэтому «self.view» сохраняет только «cv.view».

Комментарии:

1. Ах, вы правы. Итак, как мне заставить это работать? Я имею в виду, что я выделил / инициализировал объект…

2. Решение состоит в том, чтобы не использовать UIViewControllers подобное. Они созданы либо для отображения в полноэкранном режиме, либо для встраивания в другой контроллер представления (навигационный контроллер, панель вкладок, разделенный вид и т.д.). Похоже, вы хотите, чтобы это представление было полноэкранным. Попробуйте использовать [self presentModalViewController:cv animated:YES];

3. Отлично. Сделал это вместо PDFViewController *cv = [[PDFViewController alloc] initWithNibName:@»PDFViewController» bundle: [NSBundle mainBundle]]; [self presentModalViewController: cv анимированный: ДА];

Ответ №2:

cv.view это средство получения, которое автоматически вызывает автоматический выпуск view ivar. Вероятно, вам лучше всего создать ivar _cv и использовать его вместо локальной переменной. Затем безопасно отпустите ivar в вашем dealloc: [_cv release]; _cv = nil;