сбой приложения после увольнения presentModalViewController - PullRequest
0 голосов
/ 30 июля 2011

У меня проблема при переходе на другой контроллер со следующими кнопками

-(IBAction)art:(id)sender{

TestYourInfoViewController *test = [[TestYourInfoViewController alloc]
                              initWithNibName:@"TestYourInfoViewController" bundle:[NSBundle mainBundle]];
test.questionType = @"art";
testYourInfoViewC = test;
[testYourInfoViewC setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
[self.navigationController presentModalViewController:testYourInfoViewC animated:YES ];
[test release];

}

и при возврате со следующим

-(IBAction)back:(id)sender{
   [[self parentViewController] dismissModalViewControllerAnimated:YES];    

}

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

1 Ответ

0 голосов
/ 31 июля 2011

Определено ли 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...