2014-09-24 11 views
8

Khi tôi nghĩ về ARC không có phí phát hành. Nhưng một khi đi qua các biến số Core Foundation, họ cũng cần phải phát hành trong ARC.Mục tiêu-c: Tại sao các biến Core Foundation cần phát hành rõ ràng trong ARC?

Mặc dù các quy tắc ARC khác nhau cho cả hai NS..CF.., có lý do cụ thể nào để không hỗ trợ CF.. trong ARC không?

+2

Tôi biết tại sao nhưng không ** TẠI SAO ** nếu điều đó có ý nghĩa. CF là một khung công tác C có sẵn cho iOS và OS X và trình biên dịch ARC không thể theo dõi phân bổ bộ nhớ trong đó. Đây là lý do tại sao bạn cần phải tự phát hành nội dung. Nhưng tôi không biết ** TẠI SAO ** ARC không thể theo dõi. Có nói rằng, đây là một phần của lý do mà Swift đến cùng. Nó loại bỏ sự cần thiết cho các công cụ C hoàn toàn. :) – Fogmeister

+0

@Fogmeister: Đồng ý, nhưng CF không được nhập vì nó là từ C? nếu không phải lý do tại sao không được sửa đổi để đáp ứng yêu cầu? – preetam

Trả lời

12

Khi tôi nghĩ về ARC không có phí phát hành.

Tôi giả sử bạn có nghĩa là "Tôi không phải lo lắng về việc phát hành". Thường có một số chi phí hoạt động, mặc dù trình biên dịch đôi khi có thể tối ưu hóa nó.

Mặc dù quy tắc ARC khác nhau cho cả NS .. và CF .., có lý do cụ thể nào không hỗ trợ CF .. trong ARC không?

Nhiều đối tượng nền tảng chính do ARC quản lý và số lượng tiếp tục tăng. Bạn có thể biết liệu một hàm cụ thể có hỗ trợ ARC hay không bằng cách tìm kiếm tiêu đề cho CF_IMPLICIT_BRIDGING_ENABLED. Nếu bạn thấy điều đó, thì các hàm trả về các đối tượng CF tương thích ARC. Trong iOS 8, ví dụ, nhiều chức năng đồ họa cốt lõi đã được thêm vào danh sách. (Tôi không muốn nhấn mạnh điều này, tôi không nói rằng hôm nay bạn không có ngày hôm nay CFRelease trên những điều này. Tôi nói rằng chúng được thiết lập để được quản lý bởi ARC, chúng được quản lý bởi ARC trong Swift và họ có thể cuối cùng được xử lý trực tiếp trong ObjC mà không cần CFRelease.)

lý do đối tượng CF không theo mặc định quản lý là ai đó đã phải trải qua và xác minh (kiểm toán) mà mỗi chức năng phù hợp với Tạo Quy ước đặt tên quy tắc hoặc chúng được chú thích chính xác cho các ngoại lệ của chúng. Đó là công việc khá tẻ nhạt, và Apple đã phát tán nó ra nhiều bản phát hành. Nhưng bạn sẽ thấy điều này trở nên tốt hơn và tốt hơn theo thời gian.

Kazuki đúng là bạn không thể đặt đối tượng được ARC quản lý trong cấu trúc hoặc liên kết, nhưng điều đó thường không ảnh hưởng đến Core Foundation.

BTW, CF_IMPLICIT_BRIDGING_ENABLED chỉ là một trình bao bọc xung quanh arc_cf_code_audited clrag pragma. Điều này được giải thích trong tài liệu ARC, 7.8.1 Auditing of C retainable pointer interfaces.

7

Nền tảng lõi là a pure C library. Do đó, ít nhất, có một lý do mà ARC không thể hỗ trợ trực tiếp đối tượng Core Foundation.

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership-qualified-fields-of-structs-and-unions

4.3.5 lĩnh vực sở hữu trình độ của cấu trúc và các đoàn thể

Một chương trình là vô hình thành nếu nó tuyên bố một thành viên của một struct C hoặc công đoàn để có một nontrivially sở hữu có trình độ kiểu.

Các loại kết quả sẽ được phi POD trong ++ cảm giác C, nhưng C không cho chúng ta công cụ ngôn ngữ rất tốt để quản lý cuộc đời của uẩn, vì vậy nó là thuận tiện hơn chỉ đơn giản là cấm họ . Vẫn có thể quản lý điều này với khoảng trống * hoặc đối tượng __unsafe_unretained.

Vì vậy trình biên dịch LLVM không thể xử lý tuổi thọ của các đối tượng Core Foundation trong cấu trúc và đoàn thể cũng như giải thích này, do C does not give us very good language tools for managing the lifetime of aggregates.

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