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)
我想你正在使用ARC和仍在NDA下的新iOS5 SDK.而不是使用保留,使用关键字'strong'.使用strong将具有与使用retain相同的行为.像这样设置你的房产:
@property (nonatomic, strong) id <FBFeedDelegate> delegate;
| 归档时间: |
|
| 查看次数: |
6203 次 |
| 最近记录: |