#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;