Я довольно долго искал этот ответ по следующим ключевым словам в Google, но ничего не получил:
+ applicationDidEnterBackground + applicationWillEnterForeground + Facebook + dealloc + SSO
Вот мое постановление проблемы:
Если нажать кнопку «Домой», чтобы приостановить приложение, и щелкнуть значок приложения, чтобы возобновить его, независимо от того, сколько раз я пытался, следующая функция будет вызываться в правильном порядке, при этом функция не будет удалена.звонил:
applicationDidEnterBackground - upon pressing home button
applicationWillEnterForeground - upon pressing app icon
Затем, если в приложении я начинаю звонок на единый вход Facebook:
[facebook authorize:_permissions delegate:self];
Странные вещи происходят:
applicationDidEnterBackground - upon Facebook SSO
Нажмите кнопку домойдля выхода из страницы единого входа Safari на Facebook
applicationWillEnterForeground - upon pressing app icon
dealloc делегата вызывается вскоре после завершения applicationWillEnterForeground
(самая первая функция, вызываемая после некоторых кодов сборки:
mov 0x56314c(%ebx),%esi
xor %eax,%eax
test %al,%al
mov 0x8(%ebp),%ecx
=>dealloc
Я действительно не знаю, что здесь происходит, и я довольно долго пытался искать ответы в Google, примерноn кто-нибудь помочь объяснить, почему это происходит?
Я использую версию Facebook "kSDKVersion = @" 2 ";".
Дополнительная информация:
После изучения проблемы я думаю, что проблема заключается в том, как мой контроллер представления взаимодействует с контроллером навигации, когда приложение снова выходит на передний план:
Мой единый вход в систему Facebook вызывается в XIB RegistrationViewController, где пользователь нажимаетКнопка для входа в сессию SSO, для отображения RegistrationViewController, я использовал следующие коды:
[_delegate.navigationController popViewControllerAnimated:NO];
_delegate.regViewController = [[RegistrationViewController alloc] initWithNibName:nil bundle:nil];
[_delegate.navigationController pushViewController:_delegate.regViewController animated:NO];
[_delegate.regViewController release];
После того, как пользователь нажимает кнопку внутри RegistrationViewController, открывается Safari.Нажатие кнопки «Домой» для выхода из Safari и щелчка значка приложения сначала вызовет:
applicationWillEnterForeground
Затем он вызывает функцию dealloc для RegistrationViewController, а эта часть мне не понятна, поскольку RegistrationViewController должен был быть сохраненНавигационный контроллер не так ли?Почему он выполняет dealloc?
Кроме того, в рамках моей процедуры dealloc RegistrationViewController, поскольку я объявил указатель _delegate в моем RegistrationViewController с помощью sharedApplication, я думаю, что логично удалять его только тогда, когда больше не требуется RegistrationViewController,но почему [_delegate release] приведет к окончательной кончине моего делегата?Разве делегат не должен постоянно находиться у кого-то еще?