2013-09-05 32 views
11

Trên MacOS, chúng tôi có một đại lý thực hiện ARC và sẽ thực hiện một số yêu cầu tới máy chủ mỗi 10 hoặc 15 giây tùy thuộc vào cài đặt của người dùng và đang hoạt động mà không gặp bất kỳ sự cố nào cho gần một năm, và chỉ một vài tuần trước, ứng dụng bị rơi trong một máy tính với một lỗi truy cập Bad, đặc biệt trên dòng này:Lỗi ngẫu nhiên trên yêu cầu đồng bộ trên đại lý Mac OS X

[NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error]; 

các Mac OS X phiên bản của máy đó gây ra vấn đề là 10.7.5, tuy nhiên trong các máy tính khác có cùng phiên bản hệ điều hành vẫn hoạt động tốt.

Chúng tôi đang sử dụng yêu cầu đồng bộ vì đó là những gì chúng tôi cần thực hiện công việc , tuy nhiên chúng tôi đã dành thời gian thực hiện cuộc gọi không đồng bộ nhưng sự cố vẫn xảy ra.

Vì vậy, sau khi xem các bài đăng khác, chúng tôi đã thêm chính sách bộ nhớ cache: [yêu cầu setCachePolicy: NSURLRequestReloadIgnoringCacheData]; để tránh mọi sự cố với yêu cầu bộ nhớ cache. Ứng dụng hoạt động tốt hơn nhưng là vẫn gặp sự cố thường xuyên trong khoảng từ 1500 đến 1800 lần lặp lại (30-40 phút), trước khi bị rơi từ 15 đến 20 lần lặp.

Bằng cách xem xét các câu hỏi khác trong ngăn xếp tràn, chúng tôi đã khắc phục sự cố này bằng cách sử dụng ASIHTTPRequest nhưng lại gặp sự cố ngẫu nhiên (có thể gặp sự cố trong lần lặp # 2 hoặC# 123x ...).

Trước khi lỗi xuất hiện, yêu cầu luôn hoạt động bình thường, chúng tôi đang nhận dữ liệu và có thể hoạt động bình thường.

Với tùy chọn NSZombieEnabled kích hoạt chúng tôi không nhận được bất kỳ thông báo khi các ứng dụng bị treo, try/catch block không hoạt động cho chúng tôi hoặc kể từ khi lỗi được trỏ đến dòng cụ thể từ trên cao;

[NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error] 

Đây là mã mà chúng ta phải thực hiện yêu cầu sử dụng NSURLConnection:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] 
    init]; [request setHTTPMethod:@"GET"]; [request setURL:[NSURL 
    URLWithString:url]]; [request setTimeoutInterval: TIMEOUT]; 
    [request setCachePolicy: NSURLRequestReloadIgnoringCacheData]; 

    NSString *authenticationHeader = [NSString 
    stringWithFormat:@"Basic %@", credentials]; [request 
    addValue:authenticationHeader 
    forHTTPHeaderField:@"Authorization"]; 

    NSError *error = nil; NSHTTPURLResponse *responseCode = nil; 

    NSData *responseData = nil; responseData = [NSURLConnection 
    sendSynchronousRequest:request returningResponse:&responseCode 
    error:&error]; 

    if([responseCode statusCode] != 200){ *hasError =[NSString 
    stringWithFormat: @"Error getting %@, HTTP status code %li", 
    [responseCode statusCode]]; return @""; 
    } 
    } 
    return [[NSString alloc] initWithData:responseData 
    encoding:NSUTF8StringEncoding]; 

Và đây là mã cho ASIHttpRequest:

(NSString *)getDataFromURL: (NSString *)urlString withB64Credentials:(NSString *)credentials error:(NSString **)hasError 
{ 
    NSString *response = @""; 
    NSURL *url = [NSURL URLWithString:urlString]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setCachePolicy:ASIDoNotReadFromCacheCachePolicy]; 
    [request setTimeOutSeconds:TIMEOUT]; 

    NSString *authenticationHeader = [NSString stringWithFormat:@"Basic %@", credentials]; 
    [request addRequestHeader:@"Authorization" value:authenticationHeader]; 
    [request startSynchronous]; 

    NSError *error = [request error]; 
    if (!error) 
     response = [request responseString]; 
    else 
     NSLog(@"%@", [error description]); 
    return response; 
} 

Bất kỳ đề nghị sẽ được đánh giá.

+0

có thể trùng lặp với lỗi [NSURLConnection (sendSynchronousRequest) trên đại lý Mac OS X] (http: // stackoverflow.com/questions/18622363/nsurlconnection-sendynchronousrequest-crashing-on-mac-os-x-agent) – Wain

+1

Bạn nên cập nhật câu hỏi của mình, không đăng lại cùng một câu hỏi. – Wain

+0

Nhật ký nói gì? – uchuugaka

Trả lời

1

Đầu tiên, mã có vẻ tốt với tôi.

Tôi sẽ làm hồ sơ bộ nhớ với các công cụ để đảm bảo ứng dụng không rò rỉ bộ nhớ. Vì mã này có thể là mã được gọi nhiều nhất trong ứng dụng của bạn, nên cũng có nhiều khả năng xảy ra lỗi hơn nếu trạng thái ứng dụng bị hỏng. Ngoài ra, bạn nên kiểm tra phần cứng của mình vì lý do tương tự (http://osxdaily.com/2011/05/03/memtest-mac-ram-test/).

Ngoài ra, mã của bạn dễ bị cô lập để bạn có thể tạo một ứng dụng thử nghiệm chỉ bằng cách gọi URL của bạn hoặc thậm chí một số URL công khai. Nếu bạn có thể khiến ứng dụng này gặp sự cố, bạn có mọi thứ để gửi lỗi tại Apple.