2011-06-22 27 views
5

Khi tôi có một khối trong Objective-C trông như thế này:Tự giữ lại trong khối Mục tiêu-C này?

self.request = [[ASIHTTPRequest requestWithURL:... 

[self.longPollRequest setCompletionBlock:^{ 
    NSLog(@"%@", self.request.responseString); 
}]; 

nó sẽ giữ lại self hoặc dứt khoát giữ lại self.request?

Trả lời

8

Khi Block Programming Topics nói:

Trong một môi trường tham khảo-tính, bởi mặc định khi bạn tham khảo một đối tượng Objective-C trong một khối, nó được giữ lại. Điều này đúng ngay cả khi bạn chỉ cần tham chiếu biến thể hiện của đối tượng. Tuy nhiên, các biến đối tượng được đánh dấu là với loại bộ lọc __block không được giữ lại.

Nếu bạn sử dụng một khối trong việc thực hiện một phương pháp, các quy tắc cho quản lý bộ nhớ của đối tượng biến dụ là tinh tế hơn:

Nếu bạn truy cập một biến Ví dụ tham khảo, tự được giữ lại;

Nếu bạn truy cập biến mẫu bằng giá trị , biến sẽ được giữ lại.

bạn tham chiếu self trong khối, vì vậy self được giữ lại.

+3

Bạn có thể tránh giữ lại 'self' nếu bạn khai báo ví dụ: __block ASIHTTPRequest * blockRequest = self.request;' và sau đó tham chiếu 'blockRequest'. Vấn đề là bạn cần phải đảm bảo rằng khi khối của bạn chạy yêu cầu chưa được deallocated. – darvids0n

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