Một số câu hỏi về Đếm tham chiếu tự động trong SDK iOS5


134

Tôi hiện đang phát triển một ứng dụng cho iPad. Quá trình phát triển bắt đầu cho iOS 4.2 và hiện đang tiếp tục (và tôi nghĩ sẽ hoàn thành) cho iOS 4.3. Tôi mới đọc về ARC trong iOS 5 và về cơ bản tôi hiểu rằng chúng ta sẽ không bao giờ cần phải phát hành và giữ lại các đối tượng nữa. Câu hỏi của tôi là:

  1. Nếu tôi quyết định nâng cấp lên iOS 5, tôi có cần xóa tất cả [myObject retain][myObject release]báo cáo khỏi mã của mình không?

  2. Nếu tôi phát triển một ứng dụng mới cho iOS 5 bằng ARC, tôi có cần thực hiện một số loại kiểm tra "tương thích retro" không? tức là: tôi có cần kiểm tra phiên bản iOS và giữ lại cuộc gọi và phát hành không? Vì vậy, về cơ bản, ARC có sẵn cho tất cả các phiên bản iOS hay chỉ dành cho iOS 5?

Câu trả lời:


150

Nếu tôi quyết định nâng cấp lên iOS 5, tôi có cần xóa tất cả các câu lệnh [myObject giữ lại] và [phát hành myObject] khỏi mã của tôi không?

Có, nhưng XCode 4.2 bao gồm một công cụ "Di chuyển đến Objective-C ARC" mới (trong menu Edit-> Refactor), công cụ này phù hợp với bạn. Gọi dealloc là một câu chuyện khác. Như đã đề cập trong các bình luận, tham chiếu clang nói rằng bạn nên giữ phương thức dealloc của mình:

Đặt vấn đề: mặc dù ARC tự động phá hủy các biến thể hiện, nhưng vẫn có những lý do chính đáng để viết phương thức dealloc, chẳng hạn như giải phóng các tài nguyên không thể giữ lại. Không gọi [super dealloc] theo phương thức như vậy gần như luôn luôn là một lỗi.

Bạn kích hoạt ARC bằng cờ trình biên dịch -fobjc-arc mới. ARC được hỗ trợ trong Xcode 4.2 cho Mac OS X v10.6 và v10.7 (ứng dụng 64 bit) và cho iOS 4 và iOS 5. (Tham chiếu yếu không được hỗ trợ trong Mac OS X v10.6 và iOS 4). Không có hỗ trợ ARC trong Xcode 4.1.

-

Nếu tôi phát triển một ứng dụng mới cho iOS 5 bằng ARC, tôi có cần thực hiện một số loại kiểm tra "tương thích retro" không? Tức là: tôi có cần kiểm tra phiên bản iOS và gọi giữ lại và phát hành cho phù hợp không? Vì vậy, về cơ bản, ARC có sẵn cho tất cả các phiên bản iOS hay chỉ dành cho iOS 5?

Không, bởi vì ARC thực hiện phép thuật của mình về thời gian biên dịch và không phải thời gian chạy.

Thay vì bạn phải nhớ khi nào nên sử dụng giữ lại, phát hành và tự động thoát, ARC đánh giá các yêu cầu trọn đời của các đối tượng của bạn và tự động chèn các lệnh gọi phương thức thích hợp cho bạn trong thời gian biên dịch. Trình biên dịch cũng tạo ra các phương thức dealloc thích hợp cho bạn.

Thông tin thêm về ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html


Cảm ơn bạn đã giải thích của bạn!
Luke47

4
Điều này không đúng 100%. Có một công cụ biên dịch xác định xem ARC có được kích hoạt hay không. Ngoài ra ARC cũng cần một số hỗ trợ thời gian chạy, vì vậy nếu bạn muốn ứng dụng của mình hoạt động trên iOS 4.x, bạn sẽ cần phải giữ lại bản phát hành và bản phát hành của mình và đảm bảo ARC được tắt.
JeremyP

8
@JeremyP - iOS 4.0 thực sự được hỗ trợ làm mục tiêu cho các ứng dụng ARC, do đó không cần phải giữ mã tham chiếu thủ công được đếm xung quanh để giải quyết nền tảng cũ hơn đó. iPhone OS 3.x có lẽ, nhưng tôi tưởng tượng Apple có thể ngừng hỗ trợ cho nền tảng mục tiêu đó một khi 5.0 xuất xưởng, giống như họ đã làm cho 2.x khi 4.0 xuất hiện.
Brad Larson

5
@Brad Cơ sở cài đặt cho iOS4 đã hơn 95%. Tôi nghĩ rằng nó tiết kiệm để giảm hỗ trợ iOS3.
Henrik P. H ship

2
Bạn không xóa dealloc, bạn chỉ cần xóa tất cả của bạn release[super dealloc]từ nó. Và trong 99,9% deallocchỉ phát hành các đối tượng, vì vậy bạn loại bỏ nó. Nhưng các đối tượng vẫn phải thực hiện các tác vụ dọn dẹp khác mà không phải release(đóng tệp, xóa trình quan sát, v.v.).
Stanislav Yaglo

8

Q1: KHÔNG, Nếu bạn có một mã hiện có, bạn có thể tiếp tục sử dụng nó như với -fno-objc-arc bạn có thể vô hiệu hóa chọn lọc ARC trên bất kỳ tệp nào.

Nếu bạn muốn tắt ARC trên các tệp MULTIPLE :

  1. Chọn các tệp mong muốn tại Target / Build Phase / Compile Source trong Xcode
  2. NHẤN NÚT ENTER . (nhấp đúp chuột chỉ chọn một tệp)
  3. Loại -fno-objc-arc
  4. Nhấn Enter hoặc Xong

Q2: KHÔNG, mục tiêu có thể thấp như iOS 4.0


7

Theo như tôi hiểu và theo như iPhone / iPod của tôi chạy iOS 5 và iOS 4.3 tương ứng hoạt động, tất cả đều khá tự động. Một ứng dụng tôi đã bắt đầu 4.0 và đã "cập nhật" để hoạt động với Xcode cho iOS 5.0 không bao giờ đưa ra bất kỳ loại cảnh báo nào theo cách của tôi về việc phát hành và giữ lại, mặc dù tất cả đều trên mọi dealloc, v.v. Tuy nhiên, một số mã tôi đã chèn (đã sao chép tệp) vào một dự án mới được tạo bằng Xcode cho iOS 5 có nhiều, rất nhiều cảnh báo. Vì vậy, có vẻ như bạn không phải xóa tất cả các cuộc gọi đó và không, bằng cách nào đó, nó sẽ tự động điều chỉnh nó cho các phiên bản cũ hơn. Cấu hình iPod của tôi, tôi thấy không có rò rỉ bộ nhớ hoặc các dấu hiệu khác của việc không giải quyết / phát hành. Không giúp đỡ à?


Phiên bản beta mới nhất thực sự nhắc tôi xóa tất cả các cuộc gọi phân bổ, và đó là về nó. Bạn vẫn có thể giữ lại / phát hành nhưng hệ thống có từ cuối cùng.
Dylan Gattey

5

Về phần này của câu hỏi của bạn

Nếu tôi phát triển một ứng dụng mới cho iOS 5 bằng ARC, tôi có cần thực hiện một số loại kiểm tra "tương thích retro" không? Tức là: tôi có cần kiểm tra phiên bản iOS và gọi giữ lại và phát hành cho phù hợp không? Vì vậy, về cơ bản, ARC có sẵn cho tất cả các phiên bản iOS hay chỉ dành cho iOS 5?

Cần lưu ý rằng trình biên dịch iOS 5 có "tính tương thích retro" (thực chất nó là mã ADDS để thực hiện công việc giữ lại / phát hành), nhưng nếu bạn không biên dịch cho iOS 5.0, bạn không thể sử dụng weaklàm từ khóa . Thay vào đó bạn sử dụng assign. Điều này thật đáng tiếc: weaklà một lợi thế rất lớn (không có con trỏ lơ lửng, bao giờ!). Xem câu hỏi của tôi ở đây cho một cuộc thảo luận về weak, assignvà ARC.


2

Nếu bạn có thể vô hiệu hóa ARC bằng cách không sử dụng cờ trình biên dịch -fobjc-arc mới, thì bạn không bị buộc phải viết lại mã di chuyển về phía trước - tôi đoán (?)

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.