Facebook类iPhone SDK SDK有取消方法吗?

BU_*_*r20 9 iphone facebook objective-c iphone-sdk-3.0

无论如何取消Facebook对象的待处理请求?

我在Facebook.h中找不到任何方法,或者访问底层NSURLConnection对象的方法.如果我按回导航栏并且它们是一个待处理的异步Facebook请求,请求会view在响应到来后尝试向已释放的消息发送消息,从而导致应用程序崩溃.

Tim*_*tis 9

对于遇到这个问题的人来说,似乎Matt的观察不适用于最新的facebook-iphone-sdk.相关方法中不再明确保留参数:

+ (FBRequest *)getRequestWithParams:(NSMutableDictionary *) params
                         httpMethod:(NSString *) httpMethod
                           delegate:(id<FBRequestDelegate>) delegate
                         requestURL:(NSString *) url {

  FBRequest* request = [[[FBRequest alloc] init] autorelease];
  request.delegate = delegate;
  request.url = url;
  request.httpMethod = httpMethod;
  request.params = params;
  request.connection = nil;
  request.responseText = nil;
Run Code Online (Sandbox Code Playgroud)

因此,委托的内存管理可以回溯到.h文件中的属性声明:

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

这意味着崩溃现在是可能的,因为在FBRequest完成之前可以释放委托对象.

更新:

问题中建议可能的解决方法,以允许取消挂起的FBRequests.

更新2:

为了避免在FBRequest完成之前委托被取消分配的情况下发生崩溃,您需要在释放委托时取消激活的FBRequest连接(这基本上是Matt在链接问题中建议的).但是(我不确定这是否是新的),你可以直接对FBRequest执行此操作,因为它暴露了它的NSURLConnection属性.因此,如果您在属性中保留FBRequest对象:

@property (nonatomic, retain) FBRequest *myRequest;
Run Code Online (Sandbox Code Playgroud)

并在拨打电话时保存请求对象:

self.myRequest = [facebookObj requestWithGraphPath:@"me" andDelegate:self];
Run Code Online (Sandbox Code Playgroud)

你可以在你的dealloc清理一切:

- (void)dealloc
{
 if( myRequest ) {
    [[myRequest connection] cancel];
    [[myRequest release];
  }

  ...

  [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

显然,在处理完响应后,您可能还应该在委托方法中释放并取消FBRequest属性.


Mat*_*ing 7

编辑 正如蒂姆对这个问题的回答所指出的,这些信息现在已经过时,最新版本的Facebook iOS SDK已经过时了.

无法取消待处理的请求.但是,这不应该崩溃您的应用程序.

Facebook类使用FBRequest类引擎盖下,使所有的REST或图形API的请求,这是与作为其委托财产到您的视图的引用(控制器?)结束的类.查看标题FBRequest:

@interface FBRequest : NSObject {
  id<FBRequestDelegate> _delegate;
  NSString*             _url;
  NSString*             _httpMethod;
  NSMutableDictionary*  _params;
  NSURLConnection*      _connection;
  NSMutableData*        _responseText;
}

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

属性声明中的assign属性使得它似乎将弱-ref存储到您的类中,但随后在FBRequest.m中:

+ (FBRequest *)getRequestWithParams:(NSMutableDictionary *) params
                         httpMethod:(NSString *) httpMethod
                           delegate:(id<FBRequestDelegate>) delegate
                         requestURL:(NSString *) url {
  FBRequest* request    = [[[FBRequest alloc] init] autorelease];
  request.delegate      = [delegate retain]; // <- It's retained! (Comment mine)
  request.url           = [url retain];
  request.httpMethod    = [httpMethod retain];
  request.params        = [params retain];
  request.connection    = nil;
  request.responseText  = nil;

  return request;
}
Run Code Online (Sandbox Code Playgroud)

它明确地保留了代表.因此,在您的应用程序的正常流程中,当您认为您的视图控制器在从导航堆栈弹出后应该被释放时,FBRequest已经确保它仍然可以通过获取它的所有权来接收响应.

这使得您可能在应用程序的其他地方遇到其他内存管理问题.