2011-12-28 24 views
6

Sử dụng API TWRequest mới của iOS 5, tôi đã chạy vào một bức tường gạch liên quan đến việc sử dụng khối.Sử dụng các khối trong khối trong Objective-C: EXC_BAD_ACCESS

Điều tôi cần làm là khi nhận được phản hồi thành công đối với yêu cầu đầu tiên, ngay lập tức kích hoạt một yêu cầu khác. Trên khối hoàn thành của yêu cầu thứ hai, tôi sau đó thông báo thành công hay thất bại của hoạt động đa bước.

Dưới đây là khoảng những gì tôi đang làm:

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

Tôi không giữ lại một trong các yêu cầu hoặc giữ một tham chiếu đến bất cứ nơi nào; nó chỉ là lửa và quên.

Tuy nhiên, khi tôi chạy ứng dụng, nó bị treo với EXC_BAD_ACCESS trên:

[secondRequest performRequestWithHandler:...]; 

Nó thực hiện yêu cầu đầu tiên tốt, nhưng khi tôi cố gắng để khởi động một thứ hai với một handler, nó bị treo. Có gì sai với mã đó?


Các phương pháp để tạo ra các yêu cầu là đơn giản như:

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

vui lòng đăng mã 'createFirstRequest' và' createSecondRequest' – vikingosegundo

+0

Bạn có thể đăng mã cho '-treateSecondRequest' không? Tôi đoán có một vấn đề với mã này đang chạy trên một chủ đề nền vì không bao giờ có một đảm bảo về mà thread một trình xử lý hoàn thành sẽ chạy trên. –

+0

Xong; xin lỗi 'bout rằng, không nghĩ rằng nó sẽ có liên quan. – biasedbit

Trả lời

18

Đảm bảo bạn đang giữ tham chiếu/giữ lại ACAccountStore sở hữu số ACAccount bạn đang sử dụng để ký TWRequest s.

Nếu không, ACAccount sẽ trở thành không hợp lệ và sau đó bạn sẽ nhận được EXC_BAD_ACCESS khi cố gắng kích hoạt TWRequest được ký với nó.

+0

Cảm ơn! Nhưng nó cảm thấy hơi khó xử. Bạn cần phải lưu một tham chiếu đến một đối tượng mà bạn sẽ không đặt trong đối tượng Yêu cầu Twitter. Rất dễ bị lỗi. – HyLian

+0

Wow, cảm ơn vì đã chỉ ra điều đó! – cleverbit

+0

điều này đã cứu cuộc sống của tôi – vangoz

1

Tôi không quen thuộc với TW *, vì vậy coi đây là một đoán hoang dã ... thử gửi một khối đống phân bổ :

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

Để làm rõ, tôi nghĩ khối bạn đang gửi là đống phân bổ, như vậy trong khi TW * có thể được giữ lại nó, nó sẽ không thực hiện bất kỳ sự khác biệt nếu nó đã đi ra khỏi s đối phó.

+0

tôi giải quyết chuyên nghiệp của tôi bằng cách sử dụng này như tôi đang sử dụng vòng cung để giữ lại là không ... – GameLoading

Các vấn đề liên quan