Taken từ tôi blog post đây: http://i.ndigo.com.br/2012/01/releasing-nsurlconnection-and-its-delegate/
Bạn sẽ phải trả thêm sự chú ý đến đối tượng delegate như, ví NSURLConnection
, có một quan tâm đặc biệt đối với các đại biểu: nó luôn luôn giữ lại.
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20001697-BAJDDIDG
initWithRequest: ủy:
cân nhắc đặc biệt: Kết nối giữ đại biểu. Nó phát hành đại biểu khi kết nối kết thúc tải, không thành công hoặc bị hủy.
Vì vậy, hãy xem xét, bạn có một số tùy chọn để đảm bảo rằng đại biểu của bạn sẽ được phát hành chính xác và tôi sẽ cố gắng giải thích 2 đơn giản.
Việc đầu tiên và được sử dụng phổ biến nhất là sử dụng cùng một lớp khởi tạo NSURLConnection làm đại biểu.
[[NSURLConnection alloc] initWithRequest:request self];
Bằng cách đó, lớp học của bạn là duy trì số lượng sẽ được tăng thêm 1 khi kết nối bắt đầu và sau đó sẽ De giảm 1 sau khi kết nối xong tải, thất bại, hoặc bị hủy, kết quả là không có rò rỉ bộ nhớ.
Tùy chọn thứ hai, tùy chọn mà bạn đang cố gắng thực hiện, là sử dụng một đối tượng khác để xử lý tất cả các cuộc gọi kết nối. Điều này làm việc tốt là tốt, nhưng bạn sẽ cần thêm sự chú ý với bộ nhớ. Một điều đơn giản bạn có thể làm để giải quyết vấn đề của mình là khởi tạo kết nối với đối tượng autorelease.
//creates the handler object
MyHandlerClass *handler = [[MyHandlerClass alloc] init];
//creates the connection with handler as an autorelease object
[[NSURLConnection alloc] initWithRequest:request delegate:[handler autorelease]];
HOẶC bạn có thể phát hành bộ xử lý của bạn ngay sau khi tạo kết nối (vì nó sẽ được đã giữ lại bởi kết nối)
//creates the handler object
MyHandlerClass *handler = [[MyHandlerClass alloc] init];
//creates the connection with handler
[[NSURLConnection alloc] initWithRequest:request delegate:handler];
//releases handler object
[handler release];
Cả hai cách sẽ rời khỏi quyền sở hữu đối tượng xử lý chỉ với kết nối lớp học, mà sẽ phát hành các đối tượng xử lý ngay sau khi nó kết thúc tải, không thành công, hoặc bị hủy bỏ, một lần nữa dẫn đến không có rò rỉ bộ nhớ.
EDIT: Bằng cách thực hiện bất kỳ tùy chọn nào ở trên, bạn không phải lo lắng về việc phát hành đại biểu (nhưng bạn vẫn phải giải phóng kết nối) trong các phương thức connection:DidFinishLoading
và connection:didFailWithError
.
vâng, đó cũng là những gì tôi nghĩ, nhưng khi tôi làm điều đó ... Tôi nhận được các vị thần truy cập tồi tệ hại tôi. –
Thực ra, tôi chắc rằng NSURLConnection không giữ lại người được ủy nhiệm (nó là một ngoại lệ trong vấn đề này). – shosti
NSURLConnection thực sự giữ lại đại biểu, kiểm tra tài liệu. –