Phương pháp hay nhất về iOS 5 (Phát hành / giữ lại?)


109

Là một lập trình viên iPhone mới bắt đầu, thực tiễn tốt nhất để viết ứng dụng được sử dụng với iOS 5 hoặc các phiên bản cũ hơn là gì? Cụ thể, tôi có nên tiếp tục sử dụng việc phát hành / giữ lại dữ liệu hay tôi nên bỏ qua điều đó? Có vấn đề gì không?


1
Sử dụng ARC và làm theo các phương pháp hay nhất được nêu tại đây: amattn.com/2011/12/07/arc_best_practices.html Nếu bạn làm điều đó, bạn sẽ thấy rằng ARC "chỉ hoạt động". Nếu bạn không tuân theo những phương pháp đó, bạn sẽ bị rò rỉ và mất rất nhiều thời gian để theo dõi chúng ....
n13

Câu trả lời:


98

Tuỳ bạn. Bạn có thể viết ứng dụng bằng ARC (Đếm tham chiếu tự động) và Xcode sẽ viết "mã keo" để cho phép các ứng dụng hỗ trợ ARC của bạn chạy trên iOS 4, không cần sửa đổi. Tuy nhiên, một số thứ nhất định sẽ không hoạt động và đáng chú ý nhất là nhiều thư viện bạn có thể muốn sử dụng (đôi khi) phát sinh vô số lỗi và bạn sẽ không thể sử dụng chúng cho đến khi các nhà phát triển phát hành bản cập nhật tương thích với ARC.


Chỉnh sửa : Gần đây tôi đã phát hiện ra rằng bạn có thể tắt ARC trên cơ sở từng tệp. Xem câu trả lời của pixelfreak . Vì vậy, lời khuyên của tôi vẫn còn, nhưng bây giờ các thư viện của bên thứ 3 không cần phải được cập nhật để hoạt động với ARC.

Đây là những gì Apple nói về việc chọn không tham gia ARC cho các tệp cụ thể:

Khi bạn di chuyển một dự án để sử dụng ARC, cờ trình biên dịch -fobjc-arc được đặt làm mặc định cho tất cả các tệp nguồn Objective-C. Bạn có thể tắt ARC cho một lớp cụ thể bằng cách sử dụng cờ trình biên dịch -fno-objc-arc cho lớp đó. Trong Xcode, trong tab Build Phases đích, hãy mở nhóm Compile Sources để hiển thị danh sách tệp nguồn. Bấm đúp vào tệp mà bạn muốn đặt cờ, nhập -fno-objc-arc trong bảng bật lên, sau đó bấm Xong.

nhập mô tả hình ảnh ở đây

Xem hướng dẫn chuyển đổi đầy đủ tại đây .


15
Rõ ràng là ARC có thể bị tắt trên cơ sở "mỗi tệp", có lẽ cho phép sử dụng các thư viện cũ ... Nhưng tôi chưa chơi với nó nên tôi chưa biết. Tôi khá vui mừng về nó mặc dù. Bạn có thể tưởng tượng một thế giới mà các nhà phát triển iOS không phải đổ mồ hôi để giữ lại / phát hành không ?? Chúng ta sẽ nói về điều gì ở đây tại SO ?? ;-)
Dan Ray

45
Ngay khi tôi cuối cùng đã xử lý tốt tất cả những thứ vớ vẩn về quản lý bộ nhớ, và sau đó chúng biến nó thành không liên quan. VIỆC LÀM !!!
Kongress

@Dan: Bạn không nói đùa nó có thể được tắt một cách có chọn lọc? Xin vui lòng cung cấp một liên kết, đó là quan trọng đối với tôi! : D
sudo rm -rf

1
Tôi tin rằng trình biên dịch không phải là theo NDA ngay bây giờ để chọn lọc loại trừ một số file (thường là ba thư mục nguồn của bên) từ mã của bạn, chỉ cần thêm này như trình biên dịch tùy chọn cho mỗi tập tin: -fno-objc-arc
blackjack75

2
@Yar: Có bạn. Tôi ước nó đơn giản như vậy, nhưng tiếc là không phải tất cả các thư viện đều đơn giản như vậy. Lấy JSONKitví dụ. Hãy thử chạy điều đó thông qua kiểm tra ARC. Bạn sẽ hiểu những gì tôi muốn nói. ;)
sudo rm -rf

170

Đối với bất kỳ ai vẫn tò mò về cách tắt ARC trên các tệp riêng lẻ, đây là những gì tôi đã làm:

  1. Đi tới cài đặt dự án của bạn, trong Build Phases > Compile Sources
  2. Chọn tệp bạn muốn tắt ARC và thêm cờ trình biên dịch -fno-objc-arc . Bạn có thể đặt cờ cho nhiều tệp trong một lần chụp bằng cách chọn tệp rồi nhấn phím "Enter".

Tôi không biết đây có phải là cách được khuyến nghị hay không, nhưng nó có hiệu quả với tôi.

Tái bút: Tôi đã thu thập thông tin này từ clang.llvm.org ở đây , thông tin này có thể truy cập công khai, do đó không theo NDA.


1
Khi tôi sử dụng cờ này với một thư viện, nó hoạt động, nhưng ngay khi tôi đưa tệp lib .h vào một lớp ARC, Xcode sẽ phàn nàn như thể tôi không có cờ ở đó. Bạn có thể yêu cầu các thư viện cũ hoạt động với cờ này không?
casey

Tôi có thể làm cho ASIHttpRequest và SBJson hoạt động (Tôi nhận được 1 cảnh báo về việc sử dụng cấu trúc trong Reachability.h). Tôi đặt cờ trong tất cả các tệp triển khai của họ.
pixelfreak

Tất cả các tệp triển khai hay chỉ là .h? Trong phần Nguồn biên dịch của dự án, nó chỉ có tệp tiêu đề, không có tệp triển khai. Tôi có thể thêm chúng, nhưng dường như nó không tác dụng khác. Để bạn tham khảo, tôi đang cố gắng để trình phân tích cú pháp REST hoạt động. ( github.com/mirek/NSMutableDictionary-REST.framework )
casey

1
Aha! Tôi đã không nhìn kỹ các lỗi. Chúng là những lỗi khác với lỗi không có cờ. Tôi vừa phải xóa nhóm phát hành tự động khỏi mã và wha-la!
casey

Khi tôi chọn nhiều tệp và nhấn enter, như nó được đề xuất ở đây, tất cả chúng đều bị xóa khỏi 'Nguồn biên dịch' trong giai đoạn Xây dựng. Tôi đã phải chọn chúng riêng lẻ. Không chắc liệu tôi có làm sai điều gì không.
Gopalakrishnan Subramanian

10

iOS 5 vẫn đang tuân theo NDA và có lẽ sẽ là cho đến khi họ phát hành phiên bản công khai. Nếu bạn có tài khoản nhà phát triển, hãy truy cập Diễn đàn nhà phát triển của Apple và hỏi tại đó.

Đối với các phiên bản trước, bạn phải đếm các tham chiếu và giữ lại và phát hành cho phù hợp. Xem hướng dẫn Quản lý Bộ nhớ .

Chỉnh sửa: Đây là thông số kỹ thuật công khai cho Đếm số tham chiếu tự động và trích dẫn từ trang iOS 5 công khai :

Đếm tham chiếu tự động (ARC) cho Objective-C làm cho việc quản lý bộ nhớ trở thành công việc của trình biên dịch. Bằng cách bật ARC với trình biên dịch LLVM mới của Apple, bạn sẽ không bao giờ cần phải nhập giữ lại hoặc phát hành lại, đơn giản hóa đáng kể quy trình phát triển, đồng thời giảm sự cố và rò rỉ bộ nhớ. Trình biên dịch có sự hiểu biết đầy đủ về các đối tượng của bạn và giải phóng từng đối tượng ngay khi nó không còn được sử dụng nữa, do đó, các ứng dụng chạy nhanh hơn bao giờ hết với hiệu suất mượt mà, có thể dự đoán được.


Các ứng dụng được phát triển bằng iOS 5 có hoạt động với iPhone cũ hơn không?
Geekgirl

Bạn sẽ có thể sử dụng các công cụ để phát triển cho các hệ điều hành cũ hơn, nhưng bạn sẽ không thể sử dụng các công nghệ mới như ARC. Nếu bạn muốn nhắm mục tiêu các hệ điều hành cũ hơn, bạn sẽ phải thực hiện quản lý bộ nhớ thủ công. Nếu bạn muốn sử dụng ARC bạn sẽ phải hạn chế người dùng iOS 5.
vua nevan

1
Tham chiếu đến ARC nằm trên trang developer.apple.com/technologies/ios5 của Apple công khai nên ít nhất một số phần của nó không thuộc NDA.
cobbal

8
Thực ra điều đó không hoàn toàn đúng. Bạn có thể xây dựng cho iOS 4 bằng ARC. Trích dẫn từ kỹ sư của Apple: " Đối với iOS 4 và Mac OS 10.6, trình biên dịch thêm một chút mã keo tương thích thời gian chạy vào ứng dụng của bạn. Điều này hoạt động với mọi thứ ngoại trừ biến __weak, yêu cầu hỗ trợ nhiều hơn mã tương thích có thể cung cấp. ARC trên iOS 4 đơn giản hơn mã không phải ARC, nhưng nó không đơn giản như ARC trên iOS 5. "Nhân tiện, ứng dụng lịch biểu WWDC được viết bằng ARC và nó hoạt động tốt trên iOS 4!
sudo rm -rf

3
Vâng; tuy nhiên điều đó đã đủ điều kiện tại cuộc nói chuyện ARC vì chỉ có mục tiêu 4.3.x có được 'keo tương thích'.
Alan Zeino,

4

Hiện tại, các chi tiết còn nhẹ / theo NDA, nhưng Apple đã triển khai Đếm tham chiếu tự động (ARC) trong iOS 5, chi tiết tại đây: http://developer.apple.com/technologies/ios5/

Nếu bạn phát triển một ứng dụng mới trong Xcode 4 với iOS 5 SDK, bạn có thể bỏ qua việc đếm giữ lại / phát hành một cách an toàn.

[sửa] sudo rm -rf tạo ra một điểm tốt; lib của bên thứ ba có thể bị ảnh hưởng đáng kể


Các ứng dụng được phát triển bằng iOS 5 có hoạt động với iPhone cũ hơn không?
Geekgirl

Nó sẽ hoạt động trên iPhone chạy iOS 5, vì vậy chỉ iPhone 3GS hoặc iPhone 4. Tôi không tin nó sẽ hỗ trợ iOS 4, nhưng một lần nữa, nó được thực hiện bởi LLVM khi biên dịch, vì vậy có thể tạo ra một tệp nhị phân cho iOS 4 và 5. Tôi thực sự khuyên bạn nên tạo tài khoản Nhà phát triển iOS và thử nghiệm với các tùy chọn có sẵn.
Dominic

Như sudo đã chỉ ra trong nhận xét của mình về câu trả lời của nevan, bạn thực sự có thể nhắm mục tiêu trở lại iOS 4.0 với ARC, vì vậy các thiết bị cũ hơn có thể chạy hệ điều hành đó tương thích với điều này.
Brad Larson

3

Không ai đề cập đến SystemConfiguration.framework ? Xin đừng quên đưa nó vào Framework . Tôi khổ sở dành vài giờ để nhận ra điều đó.


bạn nên giải thích tại sao.
John Riselvato

3

Đó chắc chắn là sự lựa chọn của nhà phát triển hoặc nhóm. ARC (Bộ đếm tham chiếu tự động) đã làm cho mọi thứ dễ dàng hơn một chút bằng cách tự động quản lý bộ nhớ cho bạn. Nó sẽ phát hành, giữ lại và dealloc khi thích hợp. Tôi tin rằng bạn nên có kinh nghiệm tự quản lý bộ nhớ tốt nhất là trong một ứng dụng thử nghiệm, nếu bạn chưa có. Một điều khác cần xem xét là liệu ứng dụng của bạn có dựa vào thư viện của bên thứ ba hay không, nếu không được chuyển đổi sang ARC sẽ ngăn ứng dụng của bạn biên dịch. Sự lựa chọn rõ ràng là phụ thuộc vào tình hình hiện tại.


0

đặt cờ là -fno-objc-arc trong cài đặt dự án> Xây dựng giai đoạn> Biên dịch nguồ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.