自定义代理无法正常工作

sim*_*nbs 0 iphone delegates exc-bad-access objective-c retain

在我提出的另一个问题中,我已经开始更多地与代表合作.现在,我已经调用了一个UIViewController ProfileViewController,我希望从Facebook加载News Feed.我也有NSObject的子类调用FBFeed.此子类加载Facebook News Feed并应将其传递回视图控制器.我对Facebook的所有请求都是通过一个名为的单身命令发送的FBRequestWrapper(在这种情况下)应该将结果传递给FBFeed.

我呼吁getFBRequestWithGraphPath:andDelegate:FBRequestWrapper其中将调用Facebook的iOS版SDK的方法,这需要委托作为参数.如果我放入self(这将是FBRequestWrapper)它工作得很好.如果我放入_delegate(这是一个实例FBFeed)应用程序崩溃了EXC_BAD_ACCESS.

我有理论为什么它会崩溃.我读过这个

@property (nonatomic, retain) id <FBFeedDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

应该

@property (nonatomic, assign) id <FBFeedDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

但是这样做时我收到以下错误:

对于unsafe_unretained属性'delegate'的现有ivar'委托'必须是__unsafe_unretained

此外,我不知道是否足以使应用程序崩溃.

这是我的代码.

ProfileViewController.h

#import <UIKit/UIKit.h>
#import "FeedTableView.h"
#import "FBFeed.h"

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

- (void)loadFeed;

@end
Run Code Online (Sandbox Code Playgroud)

ProfileViewController.m

@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
Run Code Online (Sandbox Code Playgroud)

FBFeed.h

#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
Run Code Online (Sandbox Code Playgroud)

FBFeed.m

#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
Run Code Online (Sandbox Code Playgroud)

FBRequestWrapper.h

#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
Run Code Online (Sandbox Code Playgroud)

FBRequestWrapper.m

#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
Run Code Online (Sandbox Code Playgroud)

Suh*_*tel 8

我想你正在使用ARC和仍在NDA下的新iOS5 SDK.而不是使用保留,使用关键字'strong'.使用strong将具有与使用retain相同的行为.像这样设置你的房产:

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