Для всех, кто сталкивается с этим вопросом, кажется, что наблюдение Мэтта не относится к новейшей 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.
Update:
Возможный способ обхода предлагается в this вопрос разрешить отмену ожидающих FBRequests.
Update 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 в методах делегатов после обработки ответа.
Спасибо, Ты спас мой день. –