0

我正在尝试将 facebook iOS SDK 集成到我的应用程序中,在我的应用程序委托标头中,我执行以下操作:

 #import <UIKit/UIKit.h>
#import "Facebook.h"
#import "FBConnect.h"

@class ViewController;

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
Facebook *facebook;
}

@property (nonatomic,strong) Facebook *facebook;

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) ViewController *viewController;

@end

并在实现文件的方法 didFinishLaunchingWithOptions 方法中:

MyFacebooDelegate *controllerDelegate = [[MyFacebooDelegate alloc] init];
facebook = [[Facebook alloc] initWithAppId:appID andDelegate:controllerDelegate];

NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
if([userDefault objectForKey:@"FBAccessTokenKey"] && [userDefault objectForKey:@"FBExpirationDateKey"])
{
    facebook.accessToken = [userDefault objectForKey:@"FBAccessTokenKey"];
    facebook.expirationDate = [userDefault objectForKey:@"FBExpirationDateKey"];

}

if(![facebook isSessionValid])
{
    NSArray *permision = [[NSArray alloc]initWithObjects:@"read_stream",nil] ;
    [facebook authorize:permision];
}

MyFacebooDelegate 类是我实现 Facebook 代表(如 FBSessionDelegate 等)的地方。

我也处理了 handleOpenURL 和 OpenURL,当我运行应用程序时,我在 safari 中获得了 facebook 身份验证屏幕,然后按“确定”屏幕被关闭并返回到我的应用程序,但有时应用程序崩溃并退出,这里是编译器告诉我错误:

- (void)fbDialogLogin:(NSString *)token expirationDate:(NSDate *)expirationDate {
self.accessToken = token;
self.expirationDate = expirationDate;
[_lastAccessTokenUpdate release];
_lastAccessTokenUpdate = [[NSDate date] retain];
[self reloadFrictionlessRecipientCache];
if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin)]) {
    [self.sessionDelegate fbDidLogin];
}

特别是编译器指出这一行:

if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin)]) {

任何帮助将不胜感激

4

2 回答 2

3

穆罕默德

以下行是错误的:

if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin)]) {

它应该如下所示:

if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin:)]) {
于 2012-08-24T15:06:39.440 回答
2

当您实例化您的会话委托时:

MyFacebooDelegate *controllerDelegate = [[MyFacebooDelegate alloc] init];
facebook = [[Facebook alloc] initWithAppId:appID andDelegate:controllerDelegate];

您不会以任何其他方式保留它。如果您查看 Facebook SDK 文件Facebook.h,您会看到该sessionDelegate属性是 type assign。这意味着您必须负责确保委托对象在向其发送消息时存在。

要解决此问题,请添加您的 AppDelegate.h 文件:

@property (strong, nonatomic) MyFacebooDelegate *controllerDelegate;

在 中didFinishLaunchingWithOptions:,而不是我帖子顶部的代码,请执行以下操作:

self.controllerDelegate = [[MyFacebooDelegate alloc] init];
facebook = [[Facebook alloc] initWithAppId:appID andDelegate:self.controllerDelegate];

这样,将保持对您的委托对象的强引用,并且不会过早地释放它。

希望这可以帮助!如果您有任何问题,请告诉我。

于 2012-08-27T07:43:19.390 回答