Ai đó có thể giải thích cho tôi một cách chi tiết khi tôi phải sử dụng từng thuộc tính: nonatomic
, copy
, strong
, weak
, và như vậy, cho một tài sản kê khai, và giải thích những gì từng làm? Một số ví dụ sẽ là tuyệt vời. Tôi đang sử dụng ARC.
Ai đó có thể giải thích cho tôi một cách chi tiết khi tôi phải sử dụng từng thuộc tính: nonatomic
, copy
, strong
, weak
, và như vậy, cho một tài sản kê khai, và giải thích những gì từng làm? Một số ví dụ sẽ là tuyệt vời. Tôi đang sử dụng ARC.
Câu trả lời:
Câu trả lời này có rất nhiều lỗi và cũng đã lỗi thời. Xin vui lòng xem các câu hỏi / câu trả lời khác và các ý kiến.
Nonatomic
nonatomic
được sử dụng cho mục đích đa luồng. Nếu chúng ta đã đặt thuộc tính nonatomic tại thời điểm khai báo, thì bất kỳ luồng nào khác muốn truy cập vào đối tượng đó đều có thể truy cập vào nó và đưa ra kết quả liên quan đến đa luồng.
Sao chép
copy
được yêu cầu khi đối tượng có thể thay đổi. Sử dụng điều này nếu bạn cần giá trị của đối tượng như hiện tại và bạn không muốn giá trị đó phản ánh bất kỳ thay đổi nào được thực hiện bởi các chủ sở hữu khác của đối tượng. Bạn sẽ cần phải giải phóng đối tượng khi bạn kết thúc với nó bởi vì bạn đang giữ lại bản sao.
Chỉ định
Assign
có phần ngược lại với copy
. Khi gọi getter của một thuộc assign
tính, nó trả về một tham chiếu đến dữ liệu thực tế. Thông thường, bạn sử dụng thuộc tính này khi bạn có một thuộc tính nguyên thủy (float, int, BOOL ...)
Giữ lại
retain
được yêu cầu khi thuộc tính là một con trỏ đến một đối tượng. Trình thiết lập được tạo bởi @synthesize
sẽ giữ lại (còn gọi là số đếm giữ lại) đối tượng. Bạn sẽ cần phải giải phóng đối tượng khi bạn kết thúc với nó. Bằng cách sử dụng giữ lại, nó sẽ tăng số lượng giữ lại và chiếm bộ nhớ trong nhóm tự động thoát.
Mạnh
strong
là một thay thế cho thuộc tính giữ lại, như là một phần của Đếm tham chiếu tự động (ARC) Objective-C. Trong mã không ARC, nó chỉ là một từ đồng nghĩa để giữ lại.
Đây là một trang web tốt để tìm hiểu về strong
và weak
cho iOS 5.
http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1
Yếu
weak
tương tự như strong
ngoại trừ việc nó sẽ không tăng số tham chiếu lên 1. Nó không trở thành chủ sở hữu của đối tượng đó mà chỉ giữ một tham chiếu đến nó. Nếu số tham chiếu của đối tượng giảm xuống 0, mặc dù bạn vẫn có thể trỏ đến nó ở đây, nó sẽ bị giải phóng khỏi bộ nhớ.
Liên kết trên chứa cả Thông tin tốt về Yếu và Mạnh.
nonatomic
có nghĩa là nó không nên được truy cập đồng thời bởi nhiều luồng. Mặc định là atomic
làm cho nó chủ đề an toàn.
nonatomic
thuộc tính nói rằng đối tượng không phải là luồng an toàn, điều đó có nghĩa là nếu một luồng khác cố gắng truy cập đối tượng này hơn những điều xấu có thể xảy ra nhưng điều này nhanh hơn nhiều so với tài sản nguyên tử.
strong
được sử dụng với ARC và về cơ bản nó giúp bạn, bằng cách không phải lo lắng về số lượng giữ lại của một đối tượng. ARC tự động phát hành nó cho bạn khi bạn hoàn thành nó. Sử dụng từ khóa strong
có nghĩa là bạn sở hữu đối tượng.
weak
quyền sở hữu có nghĩa là bạn không sở hữu nó và nó chỉ theo dõi đối tượng cho đến khi đối tượng được chỉ định ở lại, ngay khi đối tượng thứ hai được giải phóng, nó mất đi là giá trị. Ví dụ. obj.a=objectB;
được sử dụng và một thuộc tính yếu, giá trị của nó sẽ chỉ có hiệu lực cho đến khi objectB vẫn còn trong bộ nhớ.
copy
tài sản được giải thích rất tốt ở đây
strong,weak,retain,copy,assign
loại trừ lẫn nhau, do đó bạn không thể sử dụng chúng vào một đối tượng duy nhất ... đọc "Tuyên bố Properties" phần
hy vọng điều này sẽ giúp bạn một chút ...
nonatomic
chỉ có nghĩa là không loại trừ được áp dụng. Nó không có nghĩa là truy cập không phải là chủ đề an toàn. Đó là một chi tiết thực hiện mà atomic
so với nonatomic
không nắm bắt.
Liên kết này có sự cố
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
gán hàm ý __unsafe_unretained quyền sở hữu.
sao chép ngụ ý quyền sở hữu __strong, cũng như hành vi thông thường của ngữ nghĩa sao chép trên setter.
giữ lại ngụ ý __strong quyền sở hữu.
mạnh mẽ ngụ ý __strong quyền sở hữu.
unsafe_unretained ngụ ý quyền sở hữu __unafe_unretained.
yếu ngụ ý __weak quyền sở hữu.
Câu trả lời tuyệt vời! Một điều mà tôi muốn làm rõ sâu hơn là nonatomic
/ atomic
. Người dùng nên hiểu rằng thuộc tính này - "tính nguyên tử" chỉ lan truyền trên tham chiếu của thuộc tính chứ không phải trên nội dung của nó. Tức là atomic
sẽ đảm bảo tính nguyên tử của người dùng để đọc / đặt con trỏ và chỉ con trỏ đến thuộc tính. Ví dụ:
@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...
Trong trường hợp này, đảm bảo rằng con trỏ tới dict
sẽ được đọc / đặt theo cách nguyên tử bởi các luồng khác nhau. NHƯNG dict
chính nó (từ điển dict
trỏ đến) vẫn là luồng không an toàn , tức là tất cả các hoạt động đọc / thêm vào từ điển vẫn là luồng không an toàn.
Nếu bạn cần bộ sưu tập an toàn luồng, bạn có kiến trúc xấu (thường xuyên hơn) HOẶC yêu cầu thực tế (hiếm hơn). Nếu đó là "yêu cầu thực tế" - bạn nên tìm thành phần thu thập an toàn chủ đề tốt và đã được kiểm tra HOẶC được chuẩn bị cho các thử nghiệm và khổ nạn bằng văn bản của riêng bạn. Trường hợp sau nhìn vào các mô hình "không khóa", "chờ miễn phí". Trông giống như khoa học tên lửa thoạt nhìn, nhưng có thể giúp bạn đạt được hiệu suất tuyệt vời so với "khóa thông thường".