Googleで次のキーワードを使用してこの回答をかなり検索しましたが、何も得られませんでした:
+applicationDidEnterBackground +applicationWillEnterForeground +Facebook +dealloc +SSO
ここに私の問題文があります:
ホームボタンを押してアプリケーションを一時停止し、アプリアイコンをクリックして再開すると、何度試しても、dealloc 関数が呼び出されることなく、次の関数が正しい順序で呼び出されます。
applicationDidEnterBackground - upon pressing home button
applicationWillEnterForeground - upon pressing app icon
次に、アプリ内で Facebook の SSO への呼び出しを開始した場合:
[facebook authorize:_permissions delegate:self];
奇妙なことが起こります:
applicationDidEnterBackground - upon Facebook SSO
ホームボタンを押して Safari の Facebook SSO ページを終了します
applicationWillEnterForeground - upon pressing app icon
デリゲートの dealloc は、applicationWillEnterForeground が終了した直後に呼び出されます
(いくつかのアセンブリ コードの後に呼び出される最初の関数:
mov 0x56314c(%ebx),%esi
xor %eax,%eax
test %al,%al
mov 0x8(%ebp),%ecx
=> 解放
ここで何が起こっているのかよくわかりません.Googleでかなり長い間答えを検索しようとしましたが、なぜこれが起こっているのか説明してもらえますか?
Facebook版「kSDKVersion = @"2";」を使用しています。
追加情報:
問題を調べた後、問題は、アプリが再びフォアグラウンドに入ったときに、View Controller が Navigation Controller と対話する方法の奥深くにあると思います。
私の Facebook SSO は、ユーザーがボタンをクリックして SSO セッションに入り、RegistrationViewController を表示する RegistrationViewController の XIB 内で呼び出されます。次のコードを使用しました。
[_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
次に、RegistrationViewControllerのdealloc関数を呼び出しますが、これは私が理解していない部分です.RegistrationViewControllerはNavigation Controllerによって保持されているはずですよね?なぜdeallocを実行しているのですか?
また、RegistrationViewController の dealloc ルーチン内で、sharedApplication を使用して RegistrationViewController 内で _delegate ポインターを宣言したので、RegistrationViewController が不要になったときに解放するのは論理的だと思いますが、なぜ [_delegate release] が永続的な終焉につながるのでしょうか。私の代理人?デリゲートは常に他の誰かによって保持されるべきではありませんか?