应用程序从Facebook SSO进入前台后奇怪的委托dealloc调用

应用程序从Facebook SSO进入前台后奇怪的委托dealloc调用,facebook,background,single-sign-on,dealloc,foreground,Facebook,Background,Single Sign On,Dealloc,Foreground,我在谷歌上用以下关键词搜索了很长时间,但一无所获: +ApplicationIdentinterBackground+applicationWillEnterForeground+Facebook+dealloc+SSO 以下是我的问题陈述: _delegate = (PHPConnectDemoAppDelegate *)[[UIApplication sharedApplication] delegate]; 如果我按home(主页)按钮暂停应用程序,然后单击应用程序图标恢复应用程序,则无

我在谷歌上用以下关键词搜索了很长时间,但一无所获:

+ApplicationIdentinterBackground+applicationWillEnterForeground+Facebook+dealloc+SSO

以下是我的问题陈述:

_delegate = (PHPConnectDemoAppDelegate *)[[UIApplication sharedApplication] delegate];
如果我按home(主页)按钮暂停应用程序,然后单击应用程序图标恢复应用程序,则无论我尝试了多少次,都将按正确顺序调用以下函数,而不会调用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
=>解除锁定

我真的不知道这里发生了什么,我在谷歌上搜索答案已经有一段时间了,有人能解释一下为什么会发生这种情况吗

我使用的是Facebook版本“kSDKVersion=@“2”

其他信息:

在研究了这个问题之后,我认为问题更深层次地在于当应用程序再次进入前台时,我的视图控制器如何与导航控制器交互:

我的Facebook SSO在RegistrationViewController的XIB中调用,用户单击按钮进入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将打开。 按home(主页)按钮退出Safari并单击应用程序图标将首先调用:

applicationWillEnterForeground
然后它调用RegistrationViewController的dealloc函数,这是我不理解的部分,因为RegistrationViewController应该由导航控制器保留,不是吗?为什么它要执行dealloc


另外,在我的RegistrationViewController解除锁定例程中,由于我已经使用sharedApplication在我的RegistrationViewController中声明了一个_委托指针,我认为只有在不再需要RegistrationViewController时解除锁定才合乎逻辑,但为什么[_委托会释放]导致我的委托人永久死亡?委托人不应该一直被其他人保留吗?

解决我问题的办法是,我正在发布我不应该发布的内容

声明如下:

_delegate = (PHPConnectDemoAppDelegate *)[[UIApplication sharedApplication] delegate];
不会将应用程序委托的保留计数增加1

因此,在同一视图控制器的解除锁定功能中,不必执行以下操作:

[_delegate release];
否则,应用程序代理的保留计数将下降到0,从而导致应用程序代理永久终止


不知何故,我认为我粘贴的汇编代码正在对保留计数进行评估,以决定是否释放应用程序委托,如果我错了,请纠正我。

我发现了一个非常有趣的URL,其中包含一些关于多线程的信息:它说:“如果打开URL/推送通知意味着你跳转到应用程序中的另一个位置,那么处理该打开的代码需要能够关闭任何-我是说任何-当前显示的UI并显示自己。这可能是一个非常困难的问题。”我不确定我的问题是否与此相关。。。