【问题标题】:ARC project with delegate reference fails compiling具有委托引用的 ARC 项目无法编译
【发布时间】:2012-03-23 17:32:47
【问题描述】:

我在 iOS 项目中实现 Facebook SDK 时遇到问题,我怀疑这应该归咎于:

[facebook authorize:permissions delegate:self];

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

我可以用这个编译:

[facebook authorize:permissions];

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

我认为我需要将该页面维护为启用 ARC,因此将标志设置为 -fno-objc-arc 不会解决此问题。

有什么想法吗?


2012 年 4 月 5 日跟进:

我能够成功实现 Facebook……但只使用了 app 中的弹出式登录方法。这是我实现它的方法(仅显示 FB 方面):

我的应用委托标头:

#import "FBConnect.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>{

    Facebook *facebook;

}

@property (nonatomic, strong) Facebook *facebook;

@end

应用委托方法,包括:

////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 或更低版本,则在登录步骤之后不会执行任何操作。知道为什么会这样吗?我可以输入我的登录数据,然后返回到应用程序,但不再提供任何选项。

感谢您迄今为止的所有反馈。也很想听听您对这个项目的看法。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 不幸的是,这也会产生错误:在“Facebook *”类型的对象上找不到属性“委托”
    【解决方案2】:

    您需要保持对 facebook 对象的强引用吗?它似乎没有保持其代表身份。

    【讨论】:

    • 如果这就是您的意思,我已在属性声明中将其设置为 (nonatomic, strong)。
    • 快速阅读 Facebook iOS SDK 没有返回任何 authorize:delegate: 方法。我错过了什么吗?
    • 有一个来自 2011 年 2 月的示例,它使用 authorize:delegate: 方法对其进行了描述。也许它已被弃用? link to example with source code
    • Facebook SDK 的文档记录很差,我猜它不仅已被弃用,而且已被删除。
    • 我能够完成这项工作,正如我在原始帖子的更新中所概述的那样。不过,它确实发展了一个新问题。我的解决方案适用于 5.1,但似乎不适用于早期的测试设备。
    【解决方案3】:

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

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

    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 委托

    【讨论】:

    • 这也没有解决它。我已经实现(我认为)所有可能的委托 - FBSessionDelegate、FBRequestDelegate、FBDialogDelegate 和 FBLoginDialogDelegate,
    • @EvanDyson 您是否尝试通过利用以下@property(nonatomic, assign) id&lt;FBSessionDelegate&gt; sessionDelegate; 来简单地设置过去使用delegate:self 传递的内容?意思是试试facebook.setSessionDelegate = self; ...现在还有 init 方法可以一次性接受委托:- (id)initWithAppId:(NSString *)appId andDelegate:(id&lt;FBSessionDelegate&gt;)delegate;
    【解决方案4】:

    我能够成功实现 Facebook……但只使用 app.js 中的弹出登录方法。详细信息已作为编辑添加到我的原始帖子中。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-08
        • 2018-02-18
        相关资源
        最近更新 更多