Nano Hash - криптовалюты, майнинг, программирование

уволитьModalViewControllerAnimated: (и уволитьViewControllerAnimated) сбой в iOS 5

Я не могу найти какого-либо логического объяснения, но факт остается фактом: в iOS 5 (xCode 4.2), если я представлюModalView:*animated:YES, я могу вызвать rejectModalViewAnimated:* нормально, но если я вызову presentModalView:*animated:NO , а затем вызов метода отклонения приводит к сбою. (Это работает так же, если я использую новый presentViewController:animated:completion: + rejectViewControllerAnimated:). Я собираюсь ПОПЫТАТЬСЯ обойти это сейчас (я не хочу, чтобы презентация была анимированной) и сообщить об ошибке в Apple, но я некоторое время ломал голову над этим. Приветствуются любые предложения. Не так много на iOS 5, поэтому, пожалуйста, помогите, если можете. Пример кода, который не дает сбоев в iOS 4 или iOS 5:

LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
[self presentModalViewController:loginController animated:YES];
[loginController release];
...
[self dismissModalViewControllerAnimated:YES];

Это приведет к сбою в iOS 5 с EXC_BAD_ACCESS при вызове отклонения:

LoginController *loginController = [[LoginController alloc]    initWithNibName:@"LoginControllerGG" bundle:nil];
[self presentModalViewController:loginController animated:NO];
[loginController release];
...
[self dismissModalViewControllerAnimated:YES]; //crashes with EXC_BAD _ACCESS

Одно примечание: у меня есть анимация в loginController, которая происходит при просмотреDidLoad. Собираюсь посмотреть, изменит ли это что-нибудь, но я хотел сделать это там, так как мне нужно решение как можно скорее.


[Изменить] Полный поток кода... В AppDelegate application:didFinishLaunchingWithOptions:

if (!loggedIn)  [myViewController showLoginPanel];

В myViewController:

- (void)showLoginPanel {    
    LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
        [self presentViewController:loginController animated:NO completion:nil];
    } else {
        [self presentModalViewController:loginController animated:NO]; //iOS 4 works fine with or without animation   
    } 
    [loginController release];  
}

В логинконтроллере:

- (IBAction)closeLoginWindow {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"CloseLoginWindow" object:nil];
}   //doing it this way because calling on the self.parentViewController doesn't work

Вернемся в myViewController:

- (void) viewDidLoad
    ...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeLoginWindow) name:@"CloseLoginWindow" object:nil];
    ...

- (void)closeLoginWindow {
    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]) {
        [self dismissViewControllerAnimated:YES completion:nil];    //iOS 5 crashes only if presentation was not animated
    } else [self dismissModalViewControllerAnimated:YES];    //deleting the previous condition, iOS 5 still crashes if presentation was not animated
}    

  • Как я и подозревал, удаление анимации из метода viewDidLoad в loginController не имеет отношения к проблеме. Вот и хватайся за соломинку. 19.10.2011
  • Это конечно странно. Вы уверены, что не выпускаете loginController в каком-либо другом месте, кроме [loginController release]? 19.10.2011
  • Я проверю, чтобы быть уверенным, но изменение флага анимации и оставление всего остального кода без изменений приводит к сбою. Я бы подумал, что проблема с управлением возникнет независимо от анимации, но на данный момент это необъяснимо, поэтому я обязательно проверю. 19.10.2011
  • @Manali, есть и другие методы, создающие экземпляр этого класса, но на момент этого сбоя их не существовало. Я отредактирую свой пост, чтобы показать точный поток. 19.10.2011
  • Просто введите NSLog, чтобы проверить наличие предупреждений о нехватке памяти, которые могут выпускать представление, и у меня нет предупреждений, и журнал не появляется. 19.10.2011

Ответы:


1

В iOS5 управление жизненным циклом как-то изменилось, и я не могу подробно объяснить этот вопрос. В любом случае, исправление состоит в том, чтобы перенести этот рабочий процесс с applicationDidFinishLaunchingWithOptions на applicationDidBecomeActive. Похоже, что-то не инициализируется сразу при вызове applicationDidFinishLaunchingWithOptions.

- (void)applicationDidFinishLaunchingWithOptions:... {    
    // in order to do this only at launching, but not on every activation 
    // Declaration as property for example
    applicationDidLaunch = YES;
}

- (void) applicationDidBecomeActive:(UIApplication *)application {
    if (applicationDidLaunch) {
        applicationDidLaunch = NO;
        [Start your login Workflow with modal view presenting here]
    }
}

Интересно ваше мнение :)....

19.10.2011
  • Похоже, мне не нужно проходить и менять все мои вызовы presentModalViewController на вызовы presentViewController, как я думал. Ничего себе, я могу сохранить это для следующего выпуска. 19.10.2011
  • У меня была та же проблема, я просто переместил ее в DidBecomeActive и отправил исправление, чтобы иметь версию без ошибок в Магазине... Понятия не имею, какие изменения жизненного цикла сделала Apple... 20.10.2011
  • это не помогает мне с: 07.08.2012

  • 2

    Я добавлю свои 2 цента: у меня был ImagePickerController, и его удаление работало только тогда, когда я не выпускал сборщик вручную (IOS 5 SDK).

    Так. для вашего случая я мог бы предложить такой обходной путь: 1. удалить строку - [loginController release]; 2. чтобы предотвратить утечку памяти, добавьте loginController в качестве свойства к вашему текущему контроллеру и освободите его только в Dealloc() текущего контроллера:

    @interface myViewController : UIViewController 
    
    @property (nonatomic, retain) LoginController *loginController;
    
    @end
    
    ...
    
    @implementation myViewController
    
    - (void)showLoginPanel {    
        self.loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
         // ... something goes here  
    }
    
    -(IBAction)loginClose() 
    {
        // this should close all windows as far as you call it from current (main) controller
        [self dismissModalViewControllerAnimated:YES]; 
        // ... then anything you want EXCEPT [loginController release];
    }
    
    -(void)dealloc() 
    {
        [loginController release];
    }
    
    @end
    

    Удачи :)

    P.S. Я только что написал это, так что это просто идея, как это обмануть. Может кто меня поправит... хотя у меня все равно сработало.

    11.01.2012
  • У меня есть showLoginPanel (IBAction) и логин закрывается как обратный вызов, но в основном потоке, а также релиз контроллера входа только в Dealloc, и у меня есть ошибка: stackoverflow.com/questions/11832981/ 07.08.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..