2

我在 Xcode 4.5 中有一个集成了 Facebook 的应用程序。我正在使用 ARC。该应用程序使用本机对话框,因此不推荐使用标头(即 Facebook.h)。显然,在关闭/清理活动会话时这样做会导致以下错误:

“类 FBSessionManualTokenCachingStrategy 的实例 0xa089350 已被释放,而键值观察者仍向其注册。观察信息被泄露,甚至可能被错误地附加到其他对象。”

在研究了这个错误后,我认为问题是当我在应用程序委托中初始化 self.Facebook 的实例时,Facebook 添加了两个观察者而不是一个,然后在注销期间只清理了一个。我已多次尝试删除这两个实例,包括此页面上有关此错误的所有解决方案:facebook ios sdk log:奇怪的消息

这些解决方案都没有对我有用,包括我看到的一个解决方案涉及我在使用 ARC 时无法使用的释放。这是我打开和关闭会话的代码以供参考:

- (void)sessionStateChanged:(FBSession *)session
                  state:(FBSessionState) state
                  error:(NSError *)error
{
switch (state) {
    case FBSessionStateOpen:
        if (!error) {
            // We have a valid session

            // Initiate a Facebook instance

            self.facebook = [[Facebook alloc]
                             initWithAppId:FBSession.activeSession.appID
                             andDelegate:nil];

            // Store the Facebook session information
             self.facebook.accessToken = FBSession.activeSession.accessToken;
            self.facebook.expirationDate = FBSession.activeSession.expirationDate;

        }
        break;
    case FBSessionStateClosed:
    case FBSessionStateClosedLoginFailed:
        [FBSession.activeSession closeAndClearTokenInformation];
        // Clear out the Facebook instance
        self.facebook = nil;
        break;
    default:
        break;
}

[[NSNotificationCenter defaultCenter]
 postNotificationName:FBSessionStateChangedNotification
 object:session];

 if (error) {
    UIAlertView *alertView = [[UIAlertView alloc]
                              initWithTitle:@"Error"
                              message:error.localizedDescription
                              delegate:nil
                              cancelButtonTitle:@"OK"
                              otherButtonTitles:nil];
    [alertView show];
 }
}

/*
 * Opens a Facebook session and optionally shows the login UX.
 */

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI //do I need this method?
{
NSArray *permissions = [[NSArray alloc] initWithObjects:
                        @"user_about_me",
                        @"read_friendlists",
                        @"read_stream",
                        @"friends_likes",
                        @"user_likes",
                        @"friends_photos",
                        @"user_photos",
                        nil];

return [FBSession openActiveSessionWithReadPermissions:permissions
                                          allowLoginUI:allowLoginUI
                                     completionHandler:^(FBSession *session,    
                                                    FBSessionState state,
                                                         NSError *error) {
                                         [self sessionStateChanged:session state:state
                                                             error:error]; }];
}

/*
 * If we have a valid session at the time of openURL call, we handle
* Facebook transitions by passing the url argument to handleOpenURL
*/

- (BOOL)application:(UIApplication *)application
        openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation {
// attempt to extract a token from the url
return [FBSession.activeSession handleOpenURL:url];
}

- (void) closeSession {
[FBSession.activeSession closeAndClearTokenInformation];
}

如果有人可以就如何解决这个问题提供任何指导,我将不胜感激。

4

0 回答 0