Vô hiệu hóa đếm tham chiếu tự động cho một số tệp


183

Tôi đã tải xuống SDK iOS 5 và thấy rằng ARC là một tính năng tuyệt vời của trình biên dịch mới của Apple. Hiện tại, nhiều khung công tác của bên thứ ba không hỗ trợ ARC. Tôi có thể sử dụng ARC cho mã mới của mình và giữ nguyên mã giữ / phát hành hiện tại không? Trình chuyển đổi ARC không hoạt động ở đây, vì một số khung, chẳng hạn như JSONKit, không thể được chuyển đổi sang ARC bằng cách sử dụng trình chuyển đổi.

Biên tập:

Câu trả lời là thêm -fno-objc-arcvào các cờ biên dịch cho các tệp bạn không muốn ARC. Trong Xcode 4, bạn có thể thực hiện việc này theo mục tiêu của mình -> Xây dựng các giai đoạn -> Biên dịch nguồn.



2
Để làm rõ, bạn chỉ cần thêm nó vào .mtập tin. Không phải .htập tin.
ma11hew28

Tôi thấy chuyện này: github.com/gowalla/AFNetworking/issues/36 Có lẽ nó giúp đỡ một người nào đó làm thế nào để tích hợp JSONKit trong iOS5 ARC được hỗ trợ dự án ;-) Nhưng tôi đã không thử nó vào lúc này ...

Phương pháp này làm việc cho tôi. Tôi đã thêm AsyncUdpSocket cho UDP Multicast vào dự án của mình và các tệp đó [ít nhất là phiên bản hiện tại] KHÔNG hỗ trợ ARC. Vì vậy, tôi đã sử dụng phương thức trên để thêm cờ trình biên dịch vào tệp AsyncUdpSocket.m và tôi có thể lấy mã để hoạt động tốt với ứng dụng của mình.
Ashu Joshi

2
Điều này hoạt động hoàn hảo! Cụ thể: Chuyển đến Mục tiêu của bạn và chọn Xây dựng giai đoạn, sau đó biên dịch nguồn. Nếu bạn nhấp đúp vào tệp .m đang đề cập, nó sẽ bật lên một hộp nơi bạn có thể nhập / dán: "-fno-objc-arc"
mpemburn

Câu trả lời:


73

Các tài liệu ARC công khai , mặc dù không trực tiếp rõ ràng về điểm này, dường như gợi ý rằng miễn là mỗi lớp là tất cả ARC hoặc tất cả được quản lý thủ công, các lớp có thể được tích hợp vào một chương trình.

Bạn chỉ không thể trộn ARC và không ARC trong một lớp duy nhất; các tài liệu nói rằng việc gửi retain, release, autorelease, hoặc retainCountcác thông điệp bằng bất kỳ phương tiện (bao gồm cả tính giờ và chậm thực hiện, trong đó sử dụng @selector) bị cấm trong mã ARC. Vì vậy, bạn không thể thực hiện phi ARC trong một lớp ARC (vì các thông báo cần thiết bị cấm) và bạn không thể thực hiện ARC trong một lớp không ARC (vì ARC thêm các yếu tố cú pháp không hợp lệ nếu không có ARC).

Tài liệu tương tự rõ ràng hơn một chút về việc bạn có thể tích hợp các thư viện / khung không ARC vào chương trình ARC hay không: Có. Nó không đề cập đến việc bạn có thể sử dụng các thư viện / khung ARC trong một chương trình trong đó tất cả mã của bạn không phải là ARC hay không, nhưng với tất cả những điều trên, hàm ý dường như là có.


Cảm ơn bạn! Tôi đã tìm ra cách vô hiệu hóa ARC cho các lớp không ARC hiện có.
men

Bạn có thể chia sẻ với chúng tôi những gì bạn đang làm?
David H

1
@David H: Nếu bạn muốn giải quyết vấn đề đó cho người hỏi, bạn nên lưu ý rằng người hỏi đã chỉnh sửa giải pháp của họ thành câu hỏi.
Peter Hosey

Quá trình biên dịch ARC không thể bị vô hiệu hóa trong các tệp CHÍNH. Clang sẽ KHÔNG biên dịch giao diện / tiêu đề dựa trên việc biên dịch tệp thực thi / phương thức. Do đó, các tệp Tiêu đề phải tương thích với cả ARC và không ARC trong một quá trình biên dịch hỗn hợp. Tôi xem đây là một lỗi trong trình biên dịch.
carmin

1
@carmin: Không phải. Trình biên dịch không xem các tệp tiêu đề trừ khi bạn nói với nó, điều mà bạn thường chỉ làm bằng cách #importlấy chúng từ các tệp mô-đun. Cài đặt cờ của trình biên dịch dành cho từng tệp mô-đun (chính xác hơn là mỗi tệp trong giai đoạn xây dựng Nguồn biên dịch mã hóa). Trình biên dịch không có cách nào để biết liệu nó có nên sử dụng ARC hay không cho bất kỳ tệp nào khác, ngoại trừ bằng cách kế thừa sự lựa chọn mà nó đã được đưa ra cho tệp mô-đun mà nó bắt đầu.
Peter Hosey

78

Nó không trực quan lắm làm thế nào để vô hiệu hóa ARC trên các tệp MULTIPLE , trong một thời gian tôi đã làm từng cái một cho đến khi tìm ra cách để làm điều đó.

  1. Chọn các tệp mong muốn tại Target / Build Phase / Compile Source trong Xcode (CMD + nhấp hoặc Shift + nhấp)
  2. ENTER PRESS (nhấp đúp chuột sẽ đặt lại lựa chọn, vì vậy nó không hoạt động)
  3. Loại -fno-objc-arc
  4. Nhấn Enter hoặc Xong

1
Nó không thực sự là một câu trả lời cho câu hỏi được hỏi ở đây, nhưng dù sao thì đây cũng là một mẹo hay! Bình chọn +1
Kristof Van Landschoot

Bạn nói đúng, không phải vậy, nhưng tôi luôn luôn tìm kiếm công tắc và câu trả lời này là một trong những hit hàng đầu. Tôi nghĩ rằng những ngày này hầu hết mọi người đã biết câu trả lời nhưng không phải là "mẹo" này
Tibidabo

35

Nếu bạn muốn tắt tính năng đếm tham chiếu tự động cho một số tệp thì thực sự đơn giản chỉ cần làm theo các bước. Bạn thêm cờ trình biên dịch trong Mục tiêu -> Xây dựng giai đoạn -> Biên dịch nguồn.

xcode

Cờ được sử dụng là -fno-objc-arc nhấn enter sau khi viết nó.! Bạn phải nhấp đúp chuột vào cột bên phải của hàng bên dưới Trình biên dịch cờ. Hy vọng nó sẽ giúp Cảm ơn :)


14
Bạn có thể sử dụng cùng một phương pháp để bật ARC trên một tệp cụ thể trong dự án không phải ARC bằng cách sử dụng cờ -fobjc-arc.
lnafziger

Quá trình biên dịch ARC không thể bị vô hiệu hóa trong các tệp CHÍNH. Clang sẽ KHÔNG biên dịch giao diện / tiêu đề dựa trên việc biên dịch tệp thực thi / phương thức. Do đó, các tệp Tiêu đề phải tương thích với cả ARC và không ARC trong một quá trình biên dịch hỗn hợp. Tôi xem đây là một lỗi trong trình biên dịch.
carmin

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.