Определено ли testYourInfoViewC
в заголовке как сохраненное @property
? Если это так, вы всегда должны ссылаться на него, используя self
и точечные обозначения.
- (IBAction)art:(id)sender
{
TestYourInfoViewController *test = [[TestYourInfoViewController alloc]
initWithNibName:@"TestYourInfoViewController" bundle:[NSBundle mainBundle]];
test.questionType = @"art";
self.testYourInfoViewC = test;
[self.testYourInfoViewC setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
[self.navigationController presentModalViewController:self.testYourInfoViewC animated:YES ];
[test release];
}
Когда вы создаете сохраненные @property
и @synthesize
его, создается установщик, который обрабатывает управление памятью, связанное с сохранением нового объекта и освобождением старого, но назначая test
для testYourInfoViewC
you ' в обход этого синтезированного сеттера.
Давайте пройдем через это здесь. Вы создали test
, используя alloc/init
, тем самым установив для его retainCount значение 1. Затем вы присвоили testYourInfoViewC
на test
. Без изменений в счетчике хранения, testYourInfoViewC
теперь просто указывает на тот же объект, что и test
, вместо сохранения копии для себя.
Теперь, когда вы вызываете release
на test
, который сохраняет счет, возвращается к 0, и объект освобождается. Ваш экземпляр TestYourInfoViewController
полностью исчез, а testYourInfoViewC
теперь колеблется на ветру. При попытке отклонить его, parentViewController
попытается отправить некоторые сообщения этому объекту за кулисами, например, -viewWillDisappear:
, -viewDidDisappear:
и т. Д.
Редактировать: Вот как я справляюсь с такой ситуацией в своих проектах. Я переопределяю геттер для свойства и определяю, нужно ли его создавать или нет. Таким образом, я могу вызвать свойство в любом месте моего кода, и я могу быть уверен, что если оно не будет создано, оно будет выделено, инициализировано и настроено как раз вовремя.
- (TestYourInfoViewController *)testYourInfoViewC
{
if (!testYourInfoViewC)
{
testYourInfoViewC = [[TestYourInfoViewController alloc] init]; // This will work because the .xib and class name are identical.
[testYourInfoViewC setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
}
return testYourInfoViewC;
}
После того, как вы настроите геттер для обеспечения отложенной реализации, ваш -art:
метод будет выглядеть следующим образом ...
- (IBAction)art:(id)sender
{
[self.navigationController presentModalViewController:self.testYourInfoViewC animated:YES];
}