Странный делегат call call call после applicationWillEnterForeground из единого входа Facebook - PullRequest
0 голосов
/ 17 мая 2011

Я довольно долго искал этот ответ по следующим ключевым словам в 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] приведет к окончательной кончине моего делегата?Разве делегат не должен постоянно находиться у кого-то еще?

1 Ответ

1 голос
/ 18 мая 2011

Решение моей проблемы состоит в том, что тот факт, что я освобождаю то, что я не должен выпускать!

Следующее утверждение:

_delegate = (PHPConnectDemoAppDelegate *)[[UIApplication sharedApplication] delegate];

не будет увеличивать счет удержания доделегат приложения на 1.

Следовательно, нет необходимости выполнять функцию dealloc того же Контроллера представления для выполнения:

[_delegate release];

, иначе количество сохраняемых данных для вашего делегата приложения падает до 0, что приводит кдо полной смерти вашего приложения.

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

...