开发者

Strange delegate dealloc call after applicationWillEnterForeground from Facebook SSO

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?


The solution to my problem is that the fact I am releasing what I shouldn't be releasing!

The following statement:

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

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:

[_delegate release];

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜