Facebook SSO 的 applicationWillEnterForeground 之后出现奇怪的委托 dealloc 调用
我在 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
按 home 按钮退出 Safari 的 Facebook SSO 页面
applicationWillEnterForeground - upon pressing app icon
委托的 dealloc 在 applicationWillEnterForeground 结束后不久被调用
(在一些汇编代码之后调用的第一个函数:
mov 0x56314c(%ebx),%esi
xor %eax,%eax
test %al,%al
mov 0x8(%ebp),%ecx
=> dealloc
我真的不知道这里发生了什么,我已经尝试过在 Google 上搜索答案已经有一段时间了,有人可以帮助解释为什么会发生这种情况吗?
我使用的是 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应该被Navigation Controller保留,不是吗?为什么要执行dealloc?
另外,在我的 RegistrationViewController dealloc 例程中,由于我使用共享应用程序在 RegistrationViewController 中声明了一个 _delegate 指针,我认为当不再需要 RegistrationViewController 时释放它才是合乎逻辑的,但为什么 [_delegate release] 会导致永久消亡我的代表?委托不应该一直由其他人保留吗?
I have searched quite a while for this answer with the following keywords on Google but I got nothing:
+applicationDidEnterBackground +applicationWillEnterForeground +Facebook +dealloc +SSO
Here is my problem statement:
If I press home button to suspend the application and click on the app icon to resume it, no matter how many times I tried, the following function will be called in the correct order, with no dealloc function being called:
applicationDidEnterBackground - upon pressing home button
applicationWillEnterForeground - upon pressing app icon
Then, if within an App I start a call to Facebook's SSO:
[facebook authorize:_permissions delegate:self];
Strange things happen:
applicationDidEnterBackground - upon Facebook SSO
Press home button to exit Safari's Facebook SSO page
applicationWillEnterForeground - upon pressing app icon
delegate's dealloc is called soon after applicationWillEnterForeground ends
(very first function called after some assembly codes:
mov 0x56314c(%ebx),%esi
xor %eax,%eax
test %al,%al
mov 0x8(%ebp),%ecx
=> dealloc
I don't really know what is going on here, and I have tried to search for the answers on Google for quite a while now, can someone help to explain why this is happening?
I am using Facebook version "kSDKVersion = @"2";".
Additional Information:
After taking a look into the problem, I think the problem lies deeper within how my view controller interacts with navigation controller when the app enters foreground again:
My Facebook SSO is invoked within RegistrationViewController's XIB where user clicks a button to enter SSO session, to display the RegistrationViewController, I used the following codes:
[_delegate.navigationController popViewControllerAnimated:NO];
_delegate.regViewController = [[RegistrationViewController alloc] initWithNibName:nil bundle:nil];
[_delegate.navigationController pushViewController:_delegate.regViewController animated:NO];
[_delegate.regViewController release];
After user clicks the button inside RegistrationViewController, Safari is opened.
Pressing home button to exit Safari and clicking the app icon will first call:
applicationWillEnterForeground
Then it calls the dealloc function of RegistrationViewController, which is the part I don't understand, since RegistrationViewController should have been retained by Navigation Controller isn't it? Why is it executing the dealloc?
Also, within my RegistrationViewController dealloc routine, since I have declared a _delegate pointer within my RegistrationViewController using sharedApplication, I think it is only logical to dealloc it when RegistrationViewController no longer is needed, but why would [_delegate release] lead to a permanent demise of my delegate? Shouldn't delegate be retained by someone else all the time?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我的问题的解决方案是我释放了我不应该释放的内容!
以下语句:
不会将应用程序委托的保留计数增加 1。
因此,没有必要在同一视图控制器的 dealloc 函数中执行:
否则应用程序委托的保留计数将下降到 0,从而导致永久您的应用程序委托的消亡。
不知何故,我认为我粘贴的汇编代码正在对保留计数进行评估,以决定是否释放应用程序委托,如果我错了,请纠正我。
The solution to my problem is that the fact I am releasing what I shouldn't be releasing!
The following statement:
will not increment the retain count to the app delegate by 1.
Therefore it is not necessary within the same View Controller's dealloc function to perform:
or else the retain count to your app delegate drops down to 0 hence leading to a permanent demise of your app delegate.
Somehow I think the assembly code I pasted is performing assessment on the retain count to decide whether to dealloc the app delegate or not, correct me if I am wrong.