使用Facebook弃用标题的错误消息

时间:2013-01-05 21:15:32

标签: xcode facebook memory-management automatic-ref-counting

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

“类的实例0xa089350 当关键值观察者仍然注册时,FBSessionManualTokenCachingStrategy被释放 用它。观察信息被泄露,甚至可能被错误地附在某些其他物体上。“

在研究了这个错误后,我认为问题是当我在app delegate中创建self.Facebook的实例时,Facebook 添加两个观察者而不是一个,然后在注销期间只清除一个。我已经多次尝试删除这两个实例,包括每个解决方案 有关此错误的页面:facebook ios sdk log : strange message

这些解决方案都没有对我有用,包括我看到的一个涉及解除分配的解决方案,因为我使用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];
}

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

0 个答案:

没有答案