Для тех, кто сталкивается с этим вопросом, похоже, что наблюдение Мэтта не относится к новейшей версии 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;
Таким образом, управление памятью для делегата возвращается к объявлению свойства в файле .h:
@property(nonatomic,assign) id<FBRequestDelegate> delegate;
Это означает, чтотеперь возможен сбой, поскольку объект делегата может быть освобожден до завершения FBRequest.
Обновление:
Возможный обходной путь предлагается в this вопрос, позволяющий отменить ожидающие запросы FBRequest.
Обновление 2:
Чтобы избежать сбоя в случае, когда делегат освобождается до завершения FBRequest, вам необходимоотмените активное соединение FBRequest, когда вы освобождаете делегата (это в основном то, что Мэтт предлагает в связанном вопросе).Однако (я не уверен, что это новое), вы можете сделать это напрямую в FBRequest, так как он предоставляет свойство NSURLConnection.Итак, если вы сохраняете свой объект FBRequest в свойстве:
@property (nonatomic, retain) FBRequest *myRequest;
и сохраняете объект запроса при совершении вызова:
self.myRequest = [facebookObj requestWithGraphPath:@"me" andDelegate:self];
, вы можете очистить все в вашем dealloc:
- (void)dealloc
{
if( myRequest ) {
[[myRequest connection] cancel];
[[myRequest release];
}
...
[super dealloc];
}
Очевидно, что вы, вероятно, также должны освободить и обнулить свойство FBRequest в методах делегатов после обработки ответа.