2011-10-25 59 views
42

Những ưu điểm và nhược điểm của việc sử dụng kiểu quản lý bộ đếm tham chiếu tự động (ARC) mới trong một dự án iOS là gì?Ưu điểm và nhược điểm của việc sử dụng ARC là gì?

Bạn có thể chọn không sử dụng ARC khi phát triển với SDK iOS 5.0 không?

Bạn có đề xuất tính toán tham chiếu ARC hoặc thủ công (MRC) cho một dự án mới không?

Ứng dụng sử dụng ARC có thể chạy trên các phiên bản hệ điều hành cũ hơn iOS 5.0 không?

+2

Bạn có một số câu hỏi ở đây, hai câu hỏi được giải quyết trong câu hỏi [Cơ chế tính tham chiếu tự động mới hoạt động như thế nào?] (Http://stackoverflow.com/questions/6385212/how-does-the-new- tự động tham chiếu-đếm-cơ chế-công việc) và [Xcode 4.2 với ARC: mã của tôi có chạy ngay cả trên các thiết bị iOS có phần mềm cũ hơn 5.0 không?] (http://stackoverflow.com/questions/7768861/xcode-4-2 -khi-arc-sẽ-my-code-run-even-on-ios-thiết bị-với-firmware-cũ-tha) –

Trả lời

60

Ưu điểm và nhược điểm của việc sử dụng kiểu quản lý bộ đếm tham chiếu tự động (ARC) mới trong dự án iOS là gì?

Thực hiện chương trình ARC gần giống với MRC viết tốt. Đó là, sự khác biệt về hành vi thường không thể phát hiện được vì cả thứ tự hoạt động và hiệu suất đều rất gần.

Nếu bạn đã biết cách triển khai các ứng dụng OS X hoặc iOS với tính năng tham khảo thủ công (MRC), ARC không thực sự thêm chức năng - nó chỉ cho phép bạn xóa hoạt động đếm tham chiếu khỏi nguồn của mình.

Nếu bạn không muốn học MRC, thì trước tiên bạn có thể muốn thử ARC. Rất nhiều người đấu tranh với, hoặc cố gắng bỏ qua các thực hành phổ biến của MRC (ví dụ: tôi đã giới thiệu một số devjc devs cho máy phân tích tĩnh). Nếu bạn muốn tránh những vấn đề đó, ARC sẽ cho phép bạn trì hoãn sự hiểu biết của mình; bạn không thể viết các chương trình objc nontrivial mà không hiểu sự đếm tham chiếu và thời gian sống và các mối quan hệ đối tượng, cho dù MRC, ARC, hay GC. ARC và GC chỉ cần xóa việc triển khai khỏi các nguồn của bạn và làm điều đúng trong hầu hết các trường hợp. Với ARC và GC, bạn sẽ vẫn cần cung cấp một số hướng dẫn.

Tôi chưa đo điều này, nhưng có thể đáng nói đến việc biên dịch Nguồn ARC sẽ mất nhiều thời gian và tài nguyên hơn.

Nếu chương trình bạn đang phát triển có sử dụng khá lỏng lẻo của tính tham khảo (ví dụ một lượng điển hình của autoreleases), chuyển sang ARC thể thực sự cải thiện thời gian thực hiện của chương trình của bạn và sử dụng bộ nhớ cao điểm.

Bạn có thể chọn không sử dụng ARC khi phát triển với SDK iOS 5.0 không?

Có, sử dụng CLANG_ENABLE_OBJC_ARC. ARC tương thích nhị phân và tất cả những gì thực sự xảy ra là trình biên dịch thực hiện tốt nhất để giới thiệu các hoạt động đếm tham chiếu thích hợp tự động cho bạn, dựa trên các khai báo hiển thị cho bản dịch hiện tại (see my answer here as to why translation visibility is important). Vì vậy, bạn cũng có thể kích hoạt và vô hiệu hóa nó cho một số nguồn trong một dự án và kích hoạt nó cho người khác.

Chế độ hỗn hợp (một số MRC và một số nguồn ARC) tuy nhiên khá phức tạp và tinh tế, đáng chú ý là có thể được sao chép bởi trình biên dịch (ví dụ: nội dung của hàm nội tuyến có thể không chính xác). Vấn đề chế độ hỗn hợp như vậy sẽ rất khó để cô lập. Các chương trình và nguồn ObjC++ sẽ là đặc biệt là về vấn đề này. Hơn nữa, hành vi có thể khác nhau dựa trên cài đặt tối ưu hóa của bạn (như một ví dụ); một chương trình hoạt động hoàn hảo trong bản dựng gỡ lỗi có thể giới thiệu một sự rò rỉ hoặc zombie trong bản phát hành.

Bạn có đề xuất tính toán tham chiếu ARC hoặc thủ công (MRC) cho dự án mới không?

Cá nhân, tôi sẽ gắn bó với MRC một thời gian. Ngay cả khi ARC đã được thử nghiệm trong việc sử dụng thế giới thực, có thể có một số vấn đề còn lại xuất hiện trong các tình huống phức tạp, mà bạn sẽ muốn tránh là người đầu tiên biết và gỡ lỗi. Bộ sưu tập rác của OS X là một ví dụ về lý do tại sao bạn có thể muốn chờ đợi. Như một ví dụ, công tắc có thể thay đổi khi các đối tượng bị phá hủy - các đối tượng của bạn có thể bị phá hủy sớm hơn và không bao giờ được đặt trong các bể tự động. Nó cũng có thể thay đổi thứ tự trong đó ivars được phát hành, có thể có một số tác dụng phụ.

Tôi cũng có một cơ sở mã lớn mà tôi không muốn mất một tuần thử nghiệm tính năng này vào lúc này. Cuối cùng, khả năng tương thích ngược vẫn còn quan trọng đối với tôi.

Ứng dụng sử dụng ARC có thể chạy trên các phiên bản hệ điều hành cũ hơn iOS 5.0 không?

Nếu bạn phát triển với MRC, nó sẽ tương thích ngược. Nếu bạn phát triển với ARC, nó sẽ không nhất thiết phải tương thích. Trong thực tế, nó thậm chí có thể không biên dịch mà không có thêm một chút công việc. Các yêu cầu cho thời gian chạy có sẵn trong một số phiên bản trước đó. See also this question. Nếu bạn cần khả năng tương thích ngược, ARC sẽ không phải là một tùy chọn cho một số phiên bản hệ điều hành.

Cuối cùng, nếu bạn giới hạn lựa chọn thành GC hoặc ARC, tôi khuyên bạn nên sử dụng ARC.

+5

Bình luận thực sự tốt. Chúng tôi đã thảo luận về việc di chuyển dự án doanh nghiệp lớn của chúng tôi từ MRC sang ARC nhưng chúng tôi nghĩ tốt hơn là nên sử dụng MRC cho các dự án lớn hoặc với các mô hình đối tượng phức tạp vì chúng tôi có quyền kiểm soát nó. Trong hầu hết các trường hợp, chúng tôi thậm chí không gọi giữ lại/giải phóng thủ công. Chúng tôi đã giữ lại tài sản cho tất cả mọi thứ và chúng tôi tự động phát hành tại thời điểm phân bổ. Nhưng bây giờ chúng ta đã tìm thấy một tình huống khi chúng ta cần kiểm soát trực tiếp bộ nhớ. – Sulthan

+0

Tôi đã dành một tuần nhưng hai ngày di chuyển thư viện 2D dựa trên OpenGL ES và tôi có thể nói với bạn ... Nếu bạn truy cập trực tiếp vào ngà voi (để tránh phí, và vì bạn biết bạn đang làm gì), bạn có rất nhiều đại biểu lan truyền xung quanh mà bạn quên thêm __unsafe_unretained, v.v. Bạn có thể kết thúc với nhiều chu kỳ lưu giữ, thực hiện -dealloc chỉ để thêm một NSLog để xem một đối tượng có bị deallocated hay không, rất nhiều cơn đau đầu trong trường hợp của tôi . Thêm vào đó các vấn đề tương thích Xcode, lỗi trong trợ lý, di chuyển không thành công ... –

+0

Trong thời gian này, tôi ** sẽ ** áp dụng ARC nhưng chỉ cho các dự án nhỏ, dựa trên UIKit nơi tôi có thể sử dụng self.this tất cả thời gian và mọi thứ đều phù hợp với các trường hợp sử dụng được dự đoán của Apple. –

1

bạn tắt/bật với CLANG_ENABLE_OBJC_ARC = NO ưu điểm là bạn phải viết ít mã và quản lý bộ nhớ dễ dàng hơn. Nhược điểm là bạn phải làm mọi thứ bạn học về quản lý bộ nhớ :) Tôi thích tắt nó đi.

+0

Cũng có thể có một hình phạt hiệu suất nhỏ nếu bạn sử dụng ARC –

+0

Trên thực tế ARC thường nhanh hơn trong thời gian chạy , chủ yếu là vì trình tối ưu hóa giải phóng các đối tượng ngay khi có thể và nó dựa vào các nhóm tự động trả tiền ít hơn. – pchap10k

+2

Nó phức tạp hơn thế. ARC nhanh hơn cả * và * chậm hơn, tùy thuộc vào tình huống. Kết quả điển hình là: giữ lại nhiều hơn và phát hành (chậm hơn), ít autoreleases (nhanh hơn, ít bộ nhớ). Cách duy nhất để biết nếu nó nhanh hơn hoặc chậm hơn cho mã cụ thể của bạn là để đo lường. –

0

Bạn có thể bật ARC thông qua "Edit-> Refactor-> Convert to Objective C Arc", điều này sẽ cấu trúc lại mã của bạn hoàn toàn (loại bỏ tất cả các cuộc gọi quản lý bộ nhớ và như vậy). Không có hoạt động nghịch đảo để đảm bảo bạn có những thứ dưới sự kiểm soát nguồn nếu bạn đang có suy nghĩ thứ hai. This post cho bạn thấy cách tắt nó cho các tệp cụ thể. Tôi không nghĩ có quá nhiều tranh luận để không chuyển sang ngoài việc thực tế là đau khổ khi thấy tất cả nỗ lực này được đưa vào quản lý bộ nhớ tốt đi xuống cống và chúng ta sẽ phải dừng nhảy lên trần nhà mỗi lần chúng ta thấy init, new, copy mà không có một bản phát hành/autorelease tương ứng (và điều đó sẽ khiến một số người quen dần dần). Có lẽ nó có thể được lập luận rằng trong một số trường hợp kết quả quản lý bộ nhớ thủ công trong thực sự đáng chú ý hiệu suất/bộ nhớ cải tiến dấu chân, nếu như vậy tôi cũng muốn được quan tâm.

0

Tôi đang sử dụng Lion và xcode 4.3. Tôi gặp vấn đề tương tự.

Để khắc phục, tôi đã chuyển "Bản cài đặt xây dựng-> Công cụ tham chiếu tự động mục tiêu-C" thành "Không".

Để thấy rằng nó được đặt thành "Có", tôi cũng phải bật tùy chọn "Tất cả" và "Cấp độ" trên thanh công cụ ngay bên dưới thanh công cụ "Cài đặt xây dựng".

Khi các tùy chọn đó được bật, tôi có thể thấy rằng dự án của tôi đã có tùy chọn đó được đặt thành "Có". Phải mất một thời gian để tôi hiểu rằng cài đặt mặc định là "Không", là những gì được hiển thị cho đến khi tôi bật tùy chọn "Cấp độ".

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