2009-03-09 25 views
8

Tôi thấy sự cố xảy ra sau 10 hoặc 20 giây sau khi yêu cầu POST tôi thực hiện đã hoàn tất (didReceiveResponse, didReceiveDataconnectionDidFinishLoading tất cả trước khi xảy ra sự cố).iPhone SDK: Gửi NSData với NSMutableURLKết quả tốt nhất trong trường hợp tai nạn bí ẩn

Đây là mã tôi đang sử dụng để thực hiện yêu cầu:

NSURL* url = [[NSURL alloc] initWithString:urlString]; 
[urlString release]; 

NSData* requestData = [jsonData dataUsingEncoding:NSUTF8StringEncoding]; 
NSString* requestDataLengthString = [[NSString alloc] initWithFormat:@"%d", [requestData length]]; 

NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url]; 
[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:requestData]; 
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[request setValue:requestDataLengthString forHTTPHeaderField:@"Content-Length"]; 
[request setTimeoutInterval:30.0]; 
[url release]; 
[requestData release]; 
[requestDataLengthString release]; 

m_URLConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
[request release]; 

gì rất kỳ quặc về vụ tai nạn này là thế này: nếu tôi không gọi setHTTPBody với đối tượng NSData tôi, setValue:@"application/json" cho Content-TypesetValue:requestDataLengthString cho Content-Length, sự cố xảy ra không phải xảy ra. Tôi hoàn toàn lúng túng như những gì đang xảy ra. Theo như tôi có thể nói, sự cố liên quan trực tiếp đến việc gửi một đối tượng NSData theo yêu cầu của tôi. Khi nó sụp đổ, các yếu tố hàng đầu trong các cuộc gọi stack cho sự sụp đổ (EXEC_BAD_ACCESS) như sau:

  • objc_msgSend
  • CFRelease
  • HTTPMessage::~HTTPMessage
  • _CFRelease
  • HTTPWriteFilter::~HTTPWriteFilter

Có ai có thể nghĩ ra điều gì đó mà tôi có thể đang làm sai? Tôi hoàn toàn mất mát những gì tôi đang làm sai, cách khắc phục nó, hoặc cách làm việc xung quanh nó. Có cách nào tốt hơn để POST dữ liệu hơn là cách tôi đang làm?

+0

Chỉ cần thử một điều gì đó: Liệu nó có bị hỏng nếu bạn xóa dòng [requestData release] không? – squelart

Trả lời

7

Bạn đúng trong vấn đề với đối tượng NSData của mình.Bạn đang phân bổ nó như vậy:

NSData* requestData = [jsonData dataUsingEncoding:NSUTF8StringEncoding]; 

Theo các quy tắc đặt ra trong Memory Management Programming Guide for Cocoa, bạn không phải là một chủ sở hữu của các dữ liệu, vì vậy bạn không nên gọi release vào nó sau này. dataUsingEncoding gọi autorelease, vì vậy đối tượng sẽ là release d vào lần tiếp theo khi kênh tự động thoát nước. Vì bạn đang bổ sung thêm release, nhóm tự động sửa sẽ cố gắng release một đối tượng đã được deallocated, gây ra sự cố.

+0

Đó là chính xác nó. Cảm ơn bạn! –

5

Bạn đã phát hành một đối tượng được tự động phát hành.

Xóa dòng [requestData release]; Bạn không cần nó. Nó gây ra sự cố, vì dữ liệu được phát hành bởi bạn, sau đó được phát hành lại khi dữ liệu được gửi xong, đây là một quá nhiều bản phát hành.

Nói chung, bạn không gọi phát hành trên một đối tượng trừ khi bạn phân bổ nó, hoặc các tài liệu rõ ràng nói rằng đối tượng trả về không được tự động phát hành. (rất hiếm). Với mã này, bạn không cần phải lo lắng rằng bạn đang sử dụng một đối tượng tự động phát hiện, cho dù bạn có làm gì đi chăng nữa, bộ nhớ sẽ ở lại cho đến khi khung bên dưới gửi dữ liệu dọc theo dây .

Tôi không biết liệu có cách nào tốt hơn để đăng dữ liệu hay không - mã bạn có vẻ ok, khác với dữ liệu json có thể được sao chép trong cả chuỗi và đối tượng dữ liệu, nhưng lượng dữ liệu bạn gửi có thể nhỏ. Nếu không, bạn nên giải phóng chuỗi jsonData ngay sau khi tạo dữ liệu. (Điều đó có nghĩa là chuỗi jsonData wuld phải từ cuộc gọi alloc/init, cùng với dữ liệu). Hoặc không làm cho jsonData thành một chuỗi, chỉ cần làm cho nó như là một dữ liệu không thể nhận biết ngay từ đầu, nhưng điều đó có thể khó xử.

--Tom

+0

Damn autorelease :-) Tôi nghĩ đây là lần cuối tôi sẽ mắc lỗi này, haha. Cảm ơn bạn! –

1

Kiểm tra cuộc gọi đến [urlString release];. nếu urlString được tạo bằng thứ gì đó chẳng hạn như stringWithFormat hoặc stringwithString, bạn không nên phát hành nó.

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