首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自定义委托不工作

自定义委托不工作
EN

Stack Overflow用户
提问于 2011-08-26 13:05:35
回答 3查看 6.2K关注 0票数 0

正如我提出的另一个问题所建议的那样,我已开始更多地与代表合作。现在,我制作了一个名为UIViewController的ProfileViewController,我想在其中加载Facebook上的新闻提要。我还有一个名为NSObject的子类FBFeed。这个子类加载Facebook并将其传递回视图控制器。我对Facebook的所有请求都是通过一个名为FBRequestWrapper的单例发送的,它(在本例中)应该将结果传递给FBFeed

我在getFBRequestWithGraphPath:andDelegate:中调用FBRequestWrapper,它将调用Facebook iOS SDK中的一个方法,该方法接受委托作为参数。如果我输入了self (这将是FBRequestWrapper),它就会工作得很好。如果我输入_delegate (这是FBFeed的一个实例),应用程序就会与EXC_BAD_ACCESS崩溃。

我有个解释它会崩溃的原因。我读过

代码语言:javascript
复制
@property (nonatomic, retain) id <FBFeedDelegate> delegate;

应该是

代码语言:javascript
复制
@property (nonatomic, assign) id <FBFeedDelegate> delegate;

但是,当这样做时,我会得到以下错误:

现有的unsafe_unretained属性‘委托’的ivar‘委托’必须是__unsafe_unretained

而且,我不知道这是否足以使应用程序崩溃。

这是我的密码。

ProfileViewController.h

代码语言:javascript
复制
#import <UIKit/UIKit.h>
#import "FeedTableView.h"
#import "FBFeed.h"

@interface ProfileViewController : UIViewController <FBFeedDelegate>
{
    FeedTableView *tableView;
}

- (void)loadFeed;

@end

ProfileViewController.m

代码语言:javascript
复制
@implementation ProfileViewController

- (void)loadFeed
{
    FBFeed *feed = [[FBFeed alloc] init];
    [feed loadNewsFeedWithDelegate:self];
}

#pragma mark -
#pragma FBFeedDelegate

- (void)finishedLoadingFeed:(FBFeed *)_feed
{
    NSLog(@"ProfileViewController: FBFeed Finished.");
}

- (void)failedToLoadFeed:(FBFeed *)_feed
{
    NSLog(@"ProfileViewController: FBFeed Failed.");
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Load feed
    [self loadFeed];
}

@end

FBFeed.h

代码语言:javascript
复制
#import <Foundation/Foundation.h>
#import "FBRequestWrapper.h"

@protocol FBFeedDelegate;

@interface FBFeed : NSObject <FBRequestDelegate>
{
    id <FBFeedDelegate> delegate;
}

@property (nonatomic, retain) id <FBFeedDelegate> delegate;

- (void)loadNewsFeedWithDelegate:(id)_delegate;

@end


@protocol FBFeedDelegate <NSObject>
@required
- (void)finishedLoadingFeed:(FBFeed *)_feed;
- (void)failedToLoadFeed:(FBFeed *)_feed;
@end

FBFeed.m

代码语言:javascript
复制
#import "FBFeed.h"

@implementation FBFeed

@synthesize delegate;

- (void)loadNewsFeedWithDelegate:(id)_delegate
{
    self.delegate = _delegate;

    [[FBRequestWrapper defaultManager] getFBRequestWithGraphPath:@"me" andDelegate:self];
}

#pragma mark -
#pragma mark FBRequest Delegate

- (void)request:(FBRequest *)request didLoad:(id)result
{
    NSLog(@"FBFeed: FBRequest Did Load.");
    NSLog(@"%@", result);
}

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error
{
    NSLog(@"FBFeed: FBRequest Failed.");
    NSLog(@"%@", error);
}

@end

FBRequestWrapper.h

代码语言:javascript
复制
#import <Foundation/Foundation.h>
#import "FBConnect.h"

@interface FBRequestWrapper : NSObject <FBRequestDelegate, FBSessionDelegate>
{
    Facebook *facebook;
    BOOL isLoggedIn;
}

@property (nonatomic, assign) BOOL isLoggedIn;

+ (id)defaultManager;
- (void)setIsLoggedIn:(BOOL)_loggedIn;
- (void)FBSessionBegin:(id<FBSessionDelegate>)_delegate;
- (void)FBLogout;
- (void)getFBRequestWithGraphPath:(NSString *)_path andDelegate:(id)_delegate;
- (void)getFBRequestWithMethodName:(NSString *)_methodName andParams:(NSMutableDictionary *)_params andDelegate:(id)_delegate;

@end

FBRequestWrapper.m

代码语言:javascript
复制
#import "FBRequestWrapper.h"

static FBRequestWrapper *defaultWrapper = nil;

@implementation FBRequestWrapper
@synthesize isLoggedIn;

+ (id)defaultManager
{
    if(!defaultWrapper)
    {
        defaultWrapper = [[FBRequestWrapper alloc] init];
    }

    return defaultWrapper;
}

- (void)getFBRequestWithGraphPath:(NSString *)_path andDelegate:(id)_delegate
{
    if (_path != nil)
    {
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

        if (_delegate == nil)
        {
            _delegate = self;
        }

        [facebook requestWithGraphPath:_path andDelegate:_delegate];
    }
}

#pragma mark -
#pragma mark FBRequestDelegate

- (void)request:(FBRequest *)request didLoad:(id)result
{
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
    NSLog(@"%@", result);
}

- (void)request:(FBRequest *)request didFailWithError:(NSError *)error
{
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
    NSLog(@"FBRequest Failed: %@", error);
}

@end
EN

Stack Overflow用户

发布于 2012-01-04 14:15:56

我认为你有两种方法:

  1. 不使用ARC并保留代码,因为如果您想使用
  2. ,请注意,通常不应该保留委托。但是当使用ARC时,一个像这样的ivar声明:

id <FBFeedDelegate> delegate

默认为

代码语言:javascript
复制
id <FBFeedDelegate> __strong delegate

所以当你声明这样的财产时:

代码语言:javascript
复制
@property (readwrite, unsafe_unretained) id <FBFeedDelegate> delegate

象牙应该是这样的:

代码语言:javascript
复制
id <FBFeedDelegate> __unsafe_unretained delegate
票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7205064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档