Per chiunque incontri questa domanda, sembra che l'osservazione di Matt non si applichi al più recente facebook-iphone-sdk. I parametri non sono più esplicitamente mantenuti nel metodo relativo:
+ (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;
Quindi la gestione della memoria per il delegato ricade sulla dichiarazione di proprietà nel file .h:
@property(nonatomic,assign) id<FBRequestDelegate> delegate;
Ciò significa che un incidente è ora possibile poiché l'oggetto delegato può essere deallocato prima che FBRequest sia completato.
Aggiornamento:
Una possibile soluzione è suggerita in this domanda per consentire la cancellazione di FBRequests in sospeso.
Aggiornamento 2:
Per evitare un arresto nel caso in cui il delegato viene deallocato prima che finisce il FBRequest, è necessario annullare la connessione del FBRequest attivo come si DEALLOCATE il delegato (che è fondamentalmente ciò che suggerisce Matt nella domanda collegata). Tuttavia (non sono sicuro che sia nuovo), puoi farlo direttamente su FBRequest poiché espone la sua proprietà NSURLConnection.Quindi, se si mantiene l'oggetto FBRequest in una proprietà:
@property (nonatomic, retain) FBRequest *myRequest;
e salvare l'oggetto di richiesta al momento della chiamata:
self.myRequest = [facebookObj requestWithGraphPath:@"me" andDelegate:self];
si può pulire tutto nel vostro dealloc:
- (void)dealloc
{
if(myRequest) {
[[myRequest connection] cancel];
[[myRequest release];
}
...
[super dealloc];
}
Ovviamente, dovresti probabilmente rilasciare e annullare la proprietà FBRequest nei metodi delegati dopo aver elaborato la risposta.
fonte
2011-05-25 16:00:11
Grazie, mi hai salvato la giornata. –