我在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];
}
如果有人可以就如何解决这个问题提供任何指导,我将不胜感激。