BU_*_*r20 9 iphone facebook objective-c iphone-sdk-3.0
无论如何取消Facebook对象的待处理请求?
我在Facebook.h中找不到任何方法,或者访问底层NSURLConnection对象的方法.如果我按回导航栏并且它们是一个待处理的异步Facebook请求,请求会view在响应到来后尝试向已释放的消息发送消息,从而导致应用程序崩溃.
对于遇到这个问题的人来说,似乎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属性.
编辑 正如蒂姆对这个问题的回答所指出的,这些信息现在已经过时,最新版本的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已经确保它仍然可以通过获取它的所有权来接收响应.
这使得您可能在应用程序的其他地方遇到其他内存管理问题.
| 归档时间: |
|
| 查看次数: |
2141 次 |
| 最近记录: |