更改视图后,iPhone Facebook Connect注销崩溃

时间:2010-01-06 01:38:31

标签: iphone objective-c facebook

我在我的应用程序中实现了Facebook Connect,就像Facebook提供的示例应用程序一样,效果很好。在用户选择通过Facebook共享数据后,他们将进入新视图并显示FB登录对话框。用户完成后,退出FB共享视图并返回到我应用程序的上一个视图。用户只要不注销就会保持登录状态 - 即使他们退出FB共享视图也是如此。这很好,正如预期的那样。

我使用与示例SessionViewController.m相同的viewDidLoad方法,这是初始化_session的地方:

- (void)viewDidLoad { 
    [_session resume];
    _loginButton.style = FBLoginButtonStyleWide;
}

但是我注意到,如果用户在退出并重新加载FB共享视图后按下Logout按钮,它将抛出SIGABRT或EXC_BAD_ACCESS并使应用程序崩溃。 EXC_BAD_ACCESS错误发生在Login按钮的touchUpInside方法的[dialog show]行:

- (void)touchUpInside {
  if (_session.isConnected) {
    [_session logout];
  } else {
    FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease];
    [dialog show];
  }

即使用户已连接,touchUpInside方法也会看到断开连接的会话...有时而不是在按下“注销”按钮后崩溃,注销将成功,但视图的状态文本仍为“登录为...”并且设置状态/上传图像按钮未隐藏。尝试再次登录会抛出一个SIGABRT,它看起来是由于FBRequest.m中的nil _session.sessionKey:344:

[_params setObject:_session.sessionKey forKey:@"session_key"];

我是否应该在视图更改中保留或执行不同的操作?

编辑:我发现另一位用户在Facebook开发者论坛上遇到同样的问题: http://forum.developers.facebook.com/viewtopic.php?pid=193727#p193727

没有发布解决方案,但如果找到一个,我会更新此问题。

1 个答案:

答案 0 :(得分:0)

_session在那时是零,对(这与“总是显示未连接”一致)。你在哪里初始化_session?

ETA:这是你的代码,取代了Facebook Connect提供的SessionViewController,对吗?

我无法弄清楚_session是如何被释放的,但这就是它的样子。

添加:

您可能希望将按钮处理程序更改为

[_ session resume];

然后在didLogin委托处理程序中执行您需要执行的操作。这样_session就会为你实例化FBLoginDialog。