2011-12-28 10 views
6

Utilizzando la nuova API TWRequest di iOS 5, ho eseguito un muro di mattoni relativo all'utilizzo del blocco.Utilizzo di blocchi all'interno di blocchi in Objective-C: EXC_BAD_ACCESS

Quello che devo fare è ricevere una risposta positiva a una prima richiesta, licenzarne immediatamente un'altra. Nel blocco di completamento della seconda richiesta, quindi, notifica l'esito positivo o negativo dell'operazione a più passaggi.

Ecco più o meno quello che sto facendo:

- (void)doRequests 
{ 
    TWRequest* firstRequest = [self createFirstRequest]; 
    [firstRequest performRequestWithHandler:^(NSData* responseData, 
               NSHTTPURLResponse* response, 
               NSError* error) { 
     // Error handling hidden for the sake of brevity... 
     TWRequest* secondRequest = [self createSecondRequest]; 
     [secondRequest performRequestWithHandler:^(NSData* a, 
                NSHTTPURLResponse* b, 
                NSError* c) { 
      // Notify of success or failure - never reaches this far 
     }]; 
    }]; 
} 

io non sto conservando una delle richieste o mantenere un riferimento ad essi ovunque; è solo fuoco e dimentichi.

Tuttavia, quando si esegue l'applicazione, si blocca con EXC_BAD_ACCESS on:

[secondRequest performRequestWithHandler:...]; 

Esegue la prima richiesta bene, ma quando provo a lanciare un secondo con un gestore, si blocca. Cosa c'è di sbagliato in quel codice?


I metodi per creare le richieste sono così semplici come:

- (TWRequest*)createFirstRequest 
{ 
    NSString* target = @"https://api.twitter.com/1/statuses/home_timeline.json"; 
    NSURL* url   = [NSURL URLWithString:target]; 
    TWRequest* request = [[TWRequest alloc] 
          initWithURL:url parameters:params 
          requestMethod:TWRequestMethodGET]; 
    // _twitterAccount is the backing ivar for property 'twitterAccount', 
    // a strong & nonatomic property of type ACAccount* 
    request.account = _twitterAccount; 

    return request; 
} 
+0

per favore pubblica il codice di 'createFirstRequest' e' createSecondRequest' – vikingosegundo

+0

Puoi pubblicare il codice per '-createSecondRequest'? Sto indovinando c'è un problema con questo codice viene eseguito su un thread in background poiché non c'è mai una garanzia su quale thread verrà eseguito un gestore di completamento. –

+0

Fatto; scusa, non pensavo sarebbe stato rilevante. – biasedbit

risposta

18

Assicurarsi che si sta mantenendo un riferimento/mantenendo la ACAccountStore che possiede il ACAccount che si utilizza per firmare i TWRequest s.

In caso contrario, lo ACAccount diventa non valido e quindi si otterrà EXC_BAD_ACCESS quando si tenta di attivare un TWRequest firmato con esso.

+0

Grazie! Ma sembra un po 'imbarazzante. È necessario salvare un riferimento a un oggetto che non si intende impostare nell'oggetto Richiesta Twitter. Molto incline agli errori. – HyLian

+0

Wow, grazie per avermelo fatto notare! – cleverbit

+0

mi ha salvato la vita – vangoz

1

io non sono a conoscenza TW *, in modo da considerare questo un ipotesi ... provare l'invio di un blocco di heap-allocato :

[firstRequest performRequestWithHandler:[^ (NSData *responseData, ...) { 
    ... 
} copy]]; 

Per chiarire, io penso il blocco che si sta inviando è heap allocata, così mentre TW * potrebbe essere suo mantenimento, non farà alcuna differenza se è già uscito di s far fronte.

+0

ho risolto il mio pro utilizzando questo come sto usando l'arco in modo da mantenere non è più ... – GameLoading