Я начал больше работать с делегатом, как это было предложено в другом вопросе, который я задал. Теперь я создал UIViewController с именем ProfileViewController, в который я хотел бы загрузить ленту новостей из Facebook. У меня также есть подкласс NSObject под названием FBFeed. Этот подкласс загружает ленту новостей Facebook и должен передать ее контроллеру представления. Все мои запросы к Facebook отправляются через синглтон с именем FBRequestWrapper, который (в данном случае) должен передавать результат FBFeed.
Я вызываю getFBRequestWithGraphPath:andDelegate: в FBRequestWrapper, который вызовет метод в Facebook iOS SDK, который принимает делегат в качестве параметра. Если я вставлю self (который будет FBRequestWrapper), он будет работать нормально. Если я введу _delegate (экземпляр FBFeed), приложение вылетит с EXC_BAD_ACCESS.
У меня есть теория, почему он может рухнуть. я прочитал это
@property (nonatomic, retain) id <FBFeedDelegate> delegate;
должно быть
@property (nonatomic, assign) id <FBFeedDelegate> delegate;
Но при этом я получаю следующую ошибку:
Существующий делегат ivar для свойства unsafe_unretained «делегат» должен быть __unsafe_unretained
Кроме того, я не знаю, достаточно ли этого для сбоя приложения.
Вот мой код.
ProfileViewController.h
#import <UIKit/UIKit.h>
#import "FeedTableView.h"
#import "FBFeed.h"
@interface ProfileViewController : UIViewController <FBFeedDelegate>
{
FeedTableView *tableView;
}
- (void)loadFeed;
@end
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
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
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
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
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
EXC_BAD_ACCESS? - person Dani   schedule 26.08.2011getFBRequestWithGraphPath:andDelegate:и происходит сбой на[self loadFeed]вProfileViewController.m(эта строка должна вызываться передgetFBRequestWithGraphPath:AndDelegate, но, как уже упоминалось, я плохо использую инструмент отладки ). При сбое приложенияUIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));вmain.mбудет выделено. - person simonbs   schedule 26.08.2011self(FBRequestWrapper), он работает нормально. КогдаFBFeedявляется делегатом, он падает. - person simonbs   schedule 26.08.2011