具有委托引用的ARC项目无法编译

时间:2012-03-23 17:32:48

标签: objective-c ios xcode facebook automatic-ref-counting

我在iOS项目中实施Facebook SDK时遇到了麻烦,我怀疑这一行应该归咎于:

[facebook authorize:permissions delegate:self];

当我尝试在我的ARC项目中运行它时,它将不允许委托:self保留。相反,它说有一个“ARC错误:'Facebook'没有可见的@interface'声明选择器'authorize:delegate:'”

我可以用这个编译:

[facebook authorize:permissions];

但我不认为Facebook和应用程序通过这样做正确地进行通信。我可以登录,但一旦重定向回我的应用程序,该应用程序不会注册它已登录并且无法执行任何共享功能。

我认为我需要在启用ARC的情况下维护该页面,因此将标志设置为-fno-objc-arc将无法解决此问题。

有什么想法吗?


FOLLOWUP 4/5/12:

我能够成功实施Facebook ......但在app中只使用弹出式登录方法。这是我如何实现它(只是FB方面显示):

我的app appate header:

#import "FBConnect.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>{

    Facebook *facebook;

}

@property (nonatomic, strong) Facebook *facebook;

@end

App委托方法,包括:

////FB ELEMENT: IMPORTING VC TO CONNECT WITH FACEBOOK
#import "ViewController.h"

////FB ELEMENT
@synthesize facebook;

///////FB ELEMENTS
// THIS METHOD SUPPORTS IOS PRE 4.2
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{

    NSLog(@"handleOpenURL called.");

    return [facebook handleOpenURL:url];

}

// THIS METHOD SUPPORTS IOS AFTER 4.2
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{

NSLog(@"openURL called.");

return [facebook handleOpenURL:url];
}

然后我希望大部分Facebook活动都在调用它的页面上。这是标题:

#import "FBConnect.h"

@interface ViewController : UIViewController <FBSessionDelegate, FBDialogDelegate>

//FB ELEMENTS
Facebook *facebook;
BOOL login;

//////SHARE PROPERTIES FOR PHOTO DISPLAY LAYER
@property (nonatomic, strong) Facebook *facebook;

在视图控制器的方法上:

@synthesize facebook;

////////////////////////////////////////////

-(void)postWall{

    NSLog(@"postWall called.");

    //CREATING MORE ACCESSIBLE VARIABLE
    NSString *photoTitle = [photoTitles objectAtIndex:pt];


    //ESTABLISHES DESCRIPTION CONTENT
    NSDictionary *itemDescriptionPre = [photoDescriptions objectAtIndex:pt];
    NSString *itemDescription = [itemDescriptionPre objectForKey:@"_content"];

    NSMutableDictionary *paramsSet = 
    [NSMutableDictionary dictionaryWithObjectsAndKeys:

     //CLICKABLE LINK COMPONENT (STORY TITLE WORKS WELL HERE)
     photoTitle, @"name",

     //STORY DESCRIPTION GOES HERE
     itemDescription, @"description",

     //STORY LINK GOES HERE
     [flickrURLLink objectAtIndex:pt], @"link",

     //PHOTO TO CONNECT WITH POST
     [photoURLsLargeImage objectAtIndex:pt], @"picture",
     nil];  

    [[self facebook] dialog:@"feed" andParams:paramsSet andDelegate:self];

}

- (void) fbDidLogin {

    facebook = [[Facebook alloc] initWithAppId:@"MY_APP_ID" andDelegate:self];

    login = YES;

    NSLog(@"Logged in with Facebook credentials");

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationKey"];
    [defaults synchronize];

    [self postWall];
}

- (void)fbDidNotLogin:(BOOL)cancelled{
    ///TO COMPLETE
}

- (void)fbDidExtendToken:(NSString*)accessToken
               expiresAt:(NSDate*)expiresAt{
    ////TO COMPLETE
}


- (void)fbDidLogout{

    login = NO;
    NSLog(@"Logged out with Facebook credentials");
}

- (void)fbSessionInvalidated{

    login = NO;

    NSLog(@"Logged out with Facebook credentials");
}

设置好之后,我确保按照Facebook教程的描述将应用ID添加到plist中,并且所有工作都按预期工作。

我知道BOOL登录值不会影响任何内容。

此代码的当前问题是5.1之前的兼容性问题。

它在我的5.1测试设备和模拟器中运行良好,但如果我转到5.0或更低版本,则在登录步骤后不会执行任何操作。知道为什么会这样吗?我能够输入我的登录数据,然后返回到应用程序,但不再提供任何选项。

感谢您到目前为止的所有反馈。很想听听你对这个项目的想法。

5 个答案:

答案 0 :(得分:0)

您使用的是没有authorize:delegate:方法的SDK版本吗?也许你需要这样做:

facebook.delegate = self;
[facebook authorize:permissions];

答案 1 :(得分:0)

你需要保持对facebook对象的强引用吗?它似乎没有保持其作为代表的地位。

答案 2 :(得分:0)

使用Facebook Graph API,应解决您的问题

// get information about the currently logged in user
[facebook requestWithGraphPath:@"me" andDelegate:self];

OR

facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID" andDelegate:self];

This instance is used to invoke SSO, as well as the Graph API and Platform Dialogs from within the app.

您的班级必须实施必要的Facebook代表

答案 3 :(得分:0)

我能够成功实施Facebook ......但在app中只使用弹出式登录方法。详细信息已添加为原始帖子的编辑内容。

答案 4 :(得分:0)

ARC文档(还是视频?)提到了这一点。编译器对未声明的方法变得更加严格。通常,添加正确的头文件应该修复它,但我不熟悉Facebook API,所以我无法确定。