Làm việc trên một dự án iOS nhắm mục tiêu 4.0 và 5.0, sử dụng ARC.ARC, Chặn và giữ lại chu kỳ
Chạy vào một vấn đề liên quan đến các khối, ARC và tham chiếu một đối tượng từ bên ngoài khối. Dưới đây là một số mã:
__block AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlock:^ {
if ([operation isCancelled]) {
return;
}
... do stuff ...
operation = nil;
}];
Trong trường hợp này, trình biên dịch đưa ra cảnh báo rằng việc sử dụng 'thao tác' trong khối sẽ dẫn đến chu kỳ lưu giữ. Dưới ARC, __block hiện giữ lại biến.
Nếu tôi thêm __unsafe_unretained, trình biên dịch sẽ giải phóng đối tượng ngay lập tức, vì vậy rõ ràng điều đó sẽ không hoạt động.
Tôi đang nhắm mục tiêu 4.0 nên tôi không thể sử dụng __weak.
tôi đã cố gắng làm một cái gì đó như thế này:
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
__block __unsafe_unretained AFHTTPRequestOperation *weakOperation = operation;
nhưng trong khi weakOperation không phải là con số không, không ai trong số đó là thuộc tính này được dân cư khi bên trong khối.
Cách tốt nhất để xử lý tình huống này do các ràng buộc của dự án được liệt kê ở trên là gì?
Tôi đã có điều 'chu kỳ không lưu giữ' được khắc sâu trong đầu, tôi thậm chí còn không nghĩ về cách bạn mô tả. Duh. Câu hỏi tiếp theo - bất kỳ cách nào để làm im lặng cảnh báo trình biên dịch? Nó sẽ làm tôi phát điên. – Hunter
Xem ["Kiểm soát chẩn đoán thông qua Pragmas"] (http://clang.llvm.org/docs/UsersManual.html#diagnostics_pragmas) trong hướng dẫn sử dụng của Clang. Bạn sẽ chỉ cần tìm ra cờ cảnh báo nào cần bỏ qua. –
Đó là '#pragma clang diagnostic ignored" -Warc-retain-cycles "', bởi by by. –