2012-10-04 24 views
20

Làm theo hướng dẫn iOS 5 về khóa học Paul Hegarty, chúng ta sẽ thấy mã này trong một ứng dụng thể hiện việc sử dụng GCD. Rõ ràng GCD yêu cầu phát hành vì các vấn đề phải làm với đa luồng có phần không thể đoán trước trong những đối tượng nào vẫn còn cần thiết.Bạn có cần phát hành hàng đợi GCD trong ARC trong iOS 6.0 không?

dispatch_async(dowloadQueue, ^{ 
    .... 
    // do some stuff 
    .... 
    }); 
    dispatch_release(dowloadQueue); 

tôi đã nâng cấp lên iOS 6 và XCode 4.5 và tôi nhận được một "ARC cấm phát hành rõ ràng ..." tin nhắn

Tôi không thử mã này dưới iOS5/XCode 4.2

Đây có phải chỉ vì ARC trở nên thông minh hơn và tôi không còn cần phải phát hành trong GCD nữa? Hay tôi chỉ hiểu lầm?

Trả lời

29

Khi bạn nhắm mục tiêu Mountain Lion và iOS 6.0, ARC giờ đây sẽ quản lý hàng đợi công văn và các loại GCD khác cho bạn. Nếu bạn nhắm mục tiêu các phiên bản trước của OS X hoặc iOS, bạn vẫn cần lưu giữ và loại bỏ các loại GCD một cách rõ ràng (không chỉ vì lý do an toàn chủ đề, bạn sẽ bị rò rỉ bộ nhớ khác), nhưng điều này được xử lý cho bạn khi chỉ nhắm mục tiêu hệ điều hành mới hơn phiên bản.

Đây là lý do tại sao bạn thấy lỗi trình biên dịch như vậy trong ARC khi nhắm mục tiêu iOS 6.0.

+0

Bạn có cần __bridge_transfer vào Objective-C khi bạn tạo hàng đợi không? – openfrog

+0

@openfrog - Không, nếu nó được coi là đối tượng Objective-C thì nó đã được xử lý bởi ARC nên không cần phải chuyển nó qua. –

+0

@BradLarson Có cách nào để tắt tính năng này không? Hoặc, làm thế nào để tôi viết nó để nó biên dịch theo cả iOS 5 và iOS 6? – fishinear

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