2011-07-31 24 views
87

Tôi đã bắt đầu phát triển ứng dụng iOS đầu tiên của mình với Xcode 4.2 và đang nhắm mục tiêu iOS 5.0 với mẫu "ứng dụng tiện ích" (mẫu đi kèm với FlipsideViewController).Làm cách nào để thay thế các tham chiếu yếu khi sử dụng ARC và nhắm mục tiêu iOS 4.0?

Tôi đọc rằng vì ARC là một tính năng biên dịch, nên nó cũng tương thích với iOS 4, vì vậy tôi đã cố nhắm mục tiêu ứng dụng của mình lên 4.3 và thử biên dịch nó. Khi tôi làm như vậy, tôi nhận được lỗi này:

FlipsideViewController.m: lỗi: Automatic Reference Đếm Vấn đề: Mục tiêu triển khai hiện tại không hỗ trợ tài liệu tham khảo __weak tự động

Nó là tham khảo dòng này:

@synthesize delegate = _delegate; 

đó biến được khai báo là:

@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate; 

tôi hiểu rằng "tài liệu tham khảo yếu s "không được hỗ trợ trong iOS 4, nhưng tôi thực sự không hiểu tại sao tôi muốn sử dụng tham chiếu yếu để bắt đầu, cũng như tôi có thể tìm ra cách viết lại những thứ để tránh sử dụng nó, trong khi vẫn tận dụng lợi thế của ARC (sau khi tất cả, nó phải làm việc với iOS 4 VÀ 5 phải không?)

Trả lời

148

Để nhắm mục tiêu hệ điều hành cũ hơn, bạn có thể sử dụng unsafe_unretained thay vì weak trong khai báo tài sản của bạn. weak tài liệu tham khảo nil mình khi mục tiêu của họ biến mất, nhưng unsafe_unretained lá mở khả năng rằng đối tượng bạn đang liên kết để có thể biến thành một con trỏ lơ lửng khi nó được deallocated. Cách thứ hai là hành vi tương tự như khi bạn đã sử dụng assign làm khai báo thuộc tính trong quản lý bộ nhớ thủ công.

Bạn thực hiện việc này để tránh duy trì chu kỳ, mà tôi đề cập đến trong câu trả lời của tôi here. Bạn không muốn có một con trỏ mạnh đến một cái gì đó mà có thể có một con trỏ mạnh trở lại đối tượng ban đầu. Sau đó, không có gì sẽ được phát hành đúng cách.

+0

Cảm ơn lời khuyên. Bạn nói "để nhắm mục tiêu hệ điều hành cũ ...". Điều này có nghĩa là tôi chỉ nên sử dụng unsafe_unretained trong các bản dựng ứng dụng cũ hơn 5.0? Hoặc tôi có thể chỉ sử dụng unsafe_unretained trong mã của tôi, và xây dựng nó để nhắm mục tiêu cả 4.x và 5.x? –

+1

@Mason - 'unsafe_unretained' được hỗ trợ trong cả iOS 4.x và 5.0, vì vậy nó cung cấp cho bạn khả năng tương thích ngược. Nếu bạn đang thực hiện một phiên bản 5.0 chỉ, bạn có thể chuyển sang 'weak' để tận dụng lợi thế của sự an toàn bổ sung mà nó mang lại cho bạn. –

+0

Tôi đã thử không an toàn, tuy nhiên, nó vẫn hoạt động. Tuy nhiên, tôi nhận được rất nhiều cảnh báo như '' ** __NSAutoreleaseNoPool(): Đối tượng 0x564bd90 của lớp __NSArrayM được tự động phát hành mà không có hồ bơi tại chỗ - chỉ rò rỉ "* ', điều đó bình thường? – fifth

11

Nếu chỉ sử dụng các tham chiếu yếu cho an toàn bổ sung, hãy gọi thủ công các hàm thời gian chạy mới nếu chúng có sẵn và dự phòng để gán đơn giản trên __unsafe_unretained biến nếu không.

ZWRCompatibility.h sẽ đơn giản hóa điều này một chút.

+0

Cảm ơn rất nhiều @rpetrich! –

10

Nhờ thư viện tương thích của Mike Ash PLWeakCompatibilty, bây giờ bạn có thể chỉ cần sử dụng __weak trên iOS 4.x, là tốt.

Thật dễ dàng để định cấu hình và không yêu cầu xem xét bổ sung hoặc nỗ lực hơn 5.x.

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