2012-03-06 30 views
12

Tôi đã sử dụng tùy chọn "Chuyển đổi mục tiêu C ARC" trong Xcode 4.3 để chuyển đổi dự án bắt đầu trong Xcode 4.0 để sử dụng ARC. Sau khi sửa lỗi mà công cụ tìm thấy, tôi đã đi qua quá trình mà công cụ di chuyển đã loại bỏ tất cả các thông báo phát hành cũng như giữ lại các thuộc tính trong các khai báo thuộc tính của tôi. Vì vậy, bây giờ tôi có tất cả các thuộc tính của mình chỉ có thuộc tính (nonatomic). Từ đọc tài liệu tôi vẫn chưa có câu trả lời rõ ràng về việc cần làm. Vì vậy, câu hỏi của tôi là: Trong trường hợp bạn bỏ qua từ khóa liên quan đến ngữ nghĩa setter (mạnh, yếu, giữ lại, gán) trong khai báo thuộc tính, thuộc tính mặc định trên thuộc tính khi sử dụng ARC là gì?Thay đổi với các thuộc tính và ivars sau khi di chuyển ARC

Tôi tìm thấy trong tài liệu là thuộc tính thuộc tính mặc định là chỉ định. Tuy nhiên, họ cũng nói rằng bây giờ thuộc tính mặc định cho ivars, trong trường hợp bạn bỏ qua, là mạnh.

Để giải thích rõ hơn câu hỏi của tôi, đây là một ví dụ. Tôi tiêu đề tập tin chúng tôi có tuyên bố:

@property (nonatomic) MyClass *objectToUse; 

và trong việc thực hiện của chúng tôi, chúng tôi chỉ có

@synthesize objectToUse; 

Nếu chúng ta sau đó viết trong một số phương pháp:

self.objectToUse = [[MyClass alloc] init]; 

có chúng tôi tạo ra một mạnh mẽ (giữ lại) hoặc tham chiếu yếu (gán)? Thay vào đó, nếu chúng tôi viết

objectToUse = [[MyClass alloc] init]; 

bằng cách sử dụng ivar, chúng tôi có thay đổi tình trạng liên quan đến chính sách lưu giữ đối tượng không? Dường như với tôi rằng bây giờ với ARC, thực hành tốt nhất của việc sử dụng các thuộc tính cho quản lý bộ nhớ không phải là thực hành tương tự nữa.

Trả lời

16

Tôi đã mở Sự cố hỗ trợ kỹ thuật. Kỹ sư đã xác minh rằng mặc định đã được thay đổi từ "gán" thành "mạnh". Lý do chính xác là sự mâu thuẫn mà bạn mô tả. Bây giờ, ivars và @properties có cùng giá trị mặc định.

Ông cho biết cả tài liệu (và cảnh báo một số người đang nhận) đều sai và sẽ được sửa. (Công cụ chuyển đổi là chính xác.) Cho đến khi được thực hiện, tôi sẽ tránh hoàn toàn mặc định hoàn toàn. Luôn chỉ định rõ ràng "mạnh", "yếu" hoặc "chỉ định".

Chỉnh sửa: clang documentation giờ đây chính thức ghi lại thay đổi này.

7

Loại mối quan hệ mặc định vẫn là assign, nghĩa là ref yếu. Ngoài ra, trong chế độ ARC trình biên dịch sẽ tạo ra lỗi khi @synthesize truy cập ing trừ khi bạn chỉ định rõ ràng loại mối quan hệ.

Sự khác biệt giữa giao để self.objectToUseobjectToUse là hình thức thứ hai sẽ luôn luôn sử dụng ARC để retain hoặc assign, trong khi hình thức đầu tiên sẽ sử dụng copy nếu bạn đã xác định một mối quan hệ copy.

+0

Do di chuyển ARC đã loại bỏ thuộc tính 'retain' khỏi các khai báo thuộc tính của mình, có thể mặc định đã thay đổi thành' strong' như của Xcode 4.3 không? Tôi không có một máy tính để kiểm tra nó ngay bây giờ, nhưng nó sẽ không làm tôi ngạc nhiên. –

+0

Đó thực sự là điều làm tôi bối rối, vì tất cả các thuộc tính 'retain' đang được ARC loại bỏ, để lại tất cả các thuộc tính có' assign' (mặc định) có nghĩa là sau khi di chuyển ARC bạn phải đi tất cả các khai báo thuộc tính của bạn và thêm Thuộc tính 'strong' để có cùng hành vi. Thật thú vị khi các đại biểu có thuộc tính 'assign' được thay đổi thành' unsafe_unretained', điều này là tốt, nhưng có khả năng 'retain' không được tự động thay đổi thành' strong'? – Luka

+0

Trông giống như một lỗi trong trình di chuyển với tôi. Tôi dường như nhớ lại các dự án của tôi 'giữ lại 'thuộc tính được chuyển đổi thành' mạnh' trong XCode 4.2 –

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