0

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] が永続的な終焉につながるのでしょうか。私の代理人?デリゲートは常に他の誰かによって保持されるべきではありませんか?

4

1 に答える 1

1

私の問題の解決策は、リリースしてはいけないものをリリースしているという事実です!

次のステートメント:

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

アプリデリゲートへの保持カウントを 1 増やしません。

したがって、同じ View Controller の dealloc 関数内で実行する必要はありません。

[_delegate release];

そうしないと、アプリのデリゲートへの保持カウントが 0 に低下し、アプリのデリゲートが永久に消滅します。

どういうわけか、私が貼り付けたアセンブリ コードは保持カウントの評価を実行して、アプリ デリゲートの割り当てを解除するかどうかを決定していると思います。間違っている場合は修正してください。

于 2011-05-18T06:16:09.643 に答える