2011-12-28 11 views
6

Korzystając z nowego interfejsu API iOS 5 TWRequest, natknąłem się na ceglaną ścianę związaną z użyciem bloku.Używanie bloków w blokach w Objective-C: EXC_BAD_ACCESS

Co muszę zrobić, to po otrzymaniu pomyślnej odpowiedzi na pierwszą prośbę, natychmiast zwolnij inną. W bloku zakończenia drugiego żądania powiadamiam o powodzeniu lub niepowodzeniu operacji wieloetapowej.

Oto z grubsza to, co robię:

- (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 
     }]; 
    }]; 
} 

ja nie zachowując jeden z wniosków lub utrzymywanie odniesienie do nich w dowolnym miejscu; to tylko ogień i zapomnienie.

Jednak kiedy uruchomić aplikację, to wywala z EXC_BAD_ACCESS na:

[secondRequest performRequestWithHandler:...]; 

Wykonuje pierwsze żądanie po prostu w porządku, ale gdy próbuję uruchomić drugi z obsługi, to wywala. Co jest nie tak z tym kodem?


Metody tworzenia wnioski są proste:

- (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

proszę napisać kod 'createFirstRequest' i' createSecondRequest' – vikingosegundo

+0

Czy możesz napisać kod dla '-createSecondRequest'? Zgaduję, że istnieje problem z uruchamianiem tego kodu na wątku w tle, ponieważ nigdy nie ma gwarancji, który wątek będzie obsługiwał procedurę obsługi zakończenia. –

+0

Gotowe; przepraszam, ale nie sądziłem, że będzie to miało znaczenie. – biasedbit

Odpowiedz

18

Upewnij się, że zachowujesz referencję/zachowując numer ACAccountStore, który jest właścicielem ACAccount używanej do podpisywania TWRequest s.

Jeśli tego nie zrobisz, ACAccount stanie się nieważny, a otrzymasz EXC_BAD_ACCESS przy próbie wywołania TWRequest z nim podpisanej.

+0

Dzięki! Ale czuje się trochę niezręcznie. Musisz zapisać odniesienie do obiektu, którego nie ustawisz w obiekcie żądania Twitter. Bardzo podatny na błędy. – HyLian

+0

Wow, dzięki za wskazanie tego! – cleverbit

+0

to uratowało moje życie – vangoz

1

nie jestem zaznajomiony z TW *, więc rozważyć tę dziką zgadywać ... spróbuj wysłać blok sterty przyznane :

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

celu wyjaśnienia, myślę blok wysyłasz jest kupa przyznane, więc podczas TW * może być zachowaniu, to nie będzie żadnej różnicy, czy to już wyszło z s sprostać.

+0

Rozwiązałem mojego robota używając tego, ponieważ używam łuku, więc zatrzymaj to już nie ... – GameLoading

Powiązane problemy