Objective-C đã khai báo các thuộc tính @property (không biến đổi, sao chép, mạnh, yếu)


289

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.


Dưới đây là câu trả lời stackoverflow.com/a/32942413/1961064
Grigori Jlavyan

rypress.com/tutorials/objective-c/properies điều này giải thích tất cả
Deepak Thakur

Câu trả lời:


559

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

Assigncó phần ngược lại với copy. Khi gọi getter của một thuộc assigntí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 @synthesizesẽ 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

stronglà 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ề strongweakcho iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

Yếu

weaktương tự như strongngoạ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.


1
nếu bạn đang sử dụng NSString này chỉ trong nội bộ lớp đó, thậm chí bạn không cần một tài sản, bạn có thể biến nó thành iVar và nếu bạn đang sử dụng nó trong một lớp khác thì tôi sẽ khuyên (mạnh, sao chép).
Ankit Srivastava

1
Bạn đang thiếu tài sản Assign.
mskw

10
nonatomiccó 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à atomiclàm cho nó chủ đề an toàn.
wcochran

1
Có một chút lo lắng rằng sau tất cả thời gian này, định nghĩa về phi vật lý vẫn còn sai và giống với nguyên tử. Tôi tự hỏi có bao nhiêu người đã sử dụng điều này trong năm năm qua và nhận được ấn tượng sai. Những gì @wcochran nói là chính xác. nonatomic có nghĩa là việc truy cập vào con trỏ không được xử lý nguyên tử và do đó không an toàn cho luồng. Lợi ích theo tôi hiểu là không gây dị ứng là trọng lượng nhẹ hơn.
John Bushnell

1
Ngoài nhận xét của @JohnBushnell còn có nhiều lỗi và không chính xác khác trong câu trả lời này. Nó cũng không già đi, lịch sử cũng vậy. Đi tìm nơi khác nếu bạn tìm kiếm một câu trả lời cho câu hỏi này.
CRD

45

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 strongcó nghĩa là bạn sở hữu đối tượng.

weakquyề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ớ.

copytài sản được giải thích rất tốt ở đây

strong,weak,retain,copy,assignloạ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 ...


tại sao mạnh, yếu, giữ lại, sao chép, chỉ định loại trừ lẫn nhau
vinoth.kumar

nonatomicchỉ 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à atomicso với nonatomickhông nắm bắt.
bbum ngày

@bbum Bạn có thể giải thích sự khác biệt giữa không loại trừ và không an toàn chủ đề ..?
Ankit Srivastava

1
Loại trừ @AnkitSrivastava là khi luồng A chặn luồng B đi xuống một đường dẫn mã. Nếu đường dẫn mã đó an toàn để thực thi từ nhiều luồng, thì việc loại trừ là không cần thiết. Không an toàn luồng có nghĩa là đường dẫn mã có thể mang lại kết quả không xác định nếu A và B đi xuống đồng thời. Đó là loại trừ có thể được sử dụng để làm cho một cái gì đó an toàn cho luồng, nhưng an toàn của luồng không yêu cầu thực hiện độc quyền-- không đồng thời--.
bbum

17

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.


thuộc tính Assign chỉ được sử dụng cho iVar và các giá trị? Vậy tại sao nó không an toàn và tại sao cần phải lưu ý rằng nó không được lưu ý?
mskw

9

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à atomicsẽ đả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 dictsẽ được đọc / đặt theo cách nguyên tử bởi các luồng khác nhau. NHƯNG dictchính nó (từ điển dicttrỏ đế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".

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.