2012-01-03 26 views
6

Trong giao diện (.h) tập tin tôi, tôi cóCác câu hỏi về một @property readonly trong ARC

@property(readonly) NSString *foo; 

và trong việc thực hiện (.m) tập tin tôi, tôi có

@synthesize foo; 

Với ARC bật, trình biên dịch cho tôi lỗi này: Vấn đề đếm tham chiếu tự động: ARC cấm tổng hợp thuộc tính của đối tượng Objective-C với thuộc tính lưu trữ hoặc quyền sở hữu không xác định.

Lỗi sẽ biến mất nếu tôi thêm strong, weak hoặc copy vào thuộc tính. Tại sao điều này? Tại sao sẽ có bất kỳ sự khác biệt nào giữa những thứ này cho thuộc tính chỉ đọc, những khác biệt đó là gì và tại sao lập trình viên phải lo lắng về chúng? Tại sao trình biên dịch không thể suy ra một thiết lập mặc định cho thuộc tính chỉ đọc?

Một câu hỏi khác khi tôi ở đó: strong, weak hoặc copy là những điều duy nhất có ý nghĩa trong ARC, phải không? Tôi không nên sử dụng retainassign nữa, phải không?

Trả lời

11

Bạn đã khai báo số @property không có bảng sao lưu. Do đó, khi trình biên dịch nhìn thấy @synthesize, nó sẽ cố gắng tổng hợp một bảng sao lưu cho bạn. Nhưng bạn chưa chỉ định loại ivar nào bạn muốn. Có nên là __strong không? __weak? __unsafe_unretained? Ban đầu, thuộc tính lưu trữ mặc định cho thuộc tính là assign, tương tự như __unsafe_unretained. Theo ARC, mặc dù, gần như là luôn luôn lựa chọn sai. Vì vậy, thay vì tổng hợp một ivar không an toàn, chúng yêu cầu bạn chỉ định loại ivar nào bạn muốn.

+0

Ah, giờ đây nó bắt đầu có ý nghĩa gì đó. Nhưng nếu tôi chỉ định 'copy' (cho thuộc tính' readwrite'), thì ivar được tạo ra có phải là '__strong' hoặc' __weak' không? – Enchilada

+0

(Trên thực tế, 'copy' cũng biên dịch cho thuộc tính' readonly', có vẻ hơi lạ đối với tôi.) – Enchilada

+5

Thuộc tính 'copy' sẽ tổng hợp các' iv_strong' ivars.Lý do chính bạn có thể khai báo 'copy' trên thuộc tính' readonly' là bạn có thể redeclare nó trong một phần mở rộng của lớp là 'readwrite'; để làm như vậy, mọi thứ khác phải phù hợp. –

2

Đây là tuyên bố cho phần còn lại của mã của bạn.
Khi bạn truy cập thuộc tính của lớp này từ một phần khác của mã, bạn cần biết liệu đối tượng bạn nhận được có mạnh hay yếu không.

Nó được sử dụng để rõ ràng hơn khi ARC không tồn tại, bởi vì lập trình viên cần thông tin này. Bây giờ, ARC làm cho rất nhiều thứ trong suốt, vì vậy nó là sự thật, bạn có thể tự hỏi tại sao nó vẫn còn ở đây.


Why can’t the compiler intelligently deduce a default setting for a read-only property?

tôi giả sử nó sẽ là khá dễ dàng để thiết lập quy ước rằng không có từ khóa có nghĩa strong hoặc nghĩa weak. Nếu nó đã không được thực hiện, họ chắc chắn có một lý do.

4

Với phiên bản mới nhất của Xcode và trình biên dịch clang gần đây, lỗi này không còn xảy ra nữa. Bạn có thể chỉ định thuộc tính là @property(nonatomic, readonly) NSObject *myProperty; trong giao diện, tổng hợp nó trong quá trình triển khai và kết quả là ivar được giả định là strong. Nếu bạn muốn rõ ràng hoặc chọn yếu, bạn có thể làm như vậy trong thuộc tính gốc, như @property(nonatomic, readonly, retain). Mục tiêu-C dần dần trở nên ít dư thừa hơn.