Tài sản của Non Nonomomic có nghĩa là gì?


144

"Nonatomic" có nghĩa là gì trong mã này?

@property(nonatomic, retain) UITextField *theUsersName;

Sự khác biệt giữa nguyên tử và không nguyên tử là gì?

Cảm ơn


3
Xin lỗi, quên chỉ định đây là trong Objective-c (ca cao)

Vui lòng đọc liên kết này - stackoverflow.com/questions/588866/
Kiếm

Đối với bất kỳ ai đọc điều này, trong năm 2014, điều quan trọng là phải nhận ra rất nhiều thông tin này đã hết hạn. Trong một từ, không có lý do nào để sử dụng nonatomic và về cơ bản là sai khi sử dụng nó, vì bất kỳ lý do nào. đó là lịch sử cổ xưa. Nonatomic có nghĩa là "chế độ không an toàn của luồng" và hiện tại (trong một từ) hoàn toàn không liên quan. Một số bình luận ở đây stackoverflow.com/q/23977765/294884
Fattie

Tôi sẽ không đồng ý với tuyên bố "không liên quan". Nếu giá trị thay đổi Hiếm khi và như ví dụ trong tài liệu Apple là họ. Nó thay đổi một lần sau đó sử dụng một gợi ý nguyên tử là một sự lãng phí tài nguyên liên quan vì không cần kiểm tra.
Nick Turner

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

Câu trả lời:


268

Hãy xem Apple Docs .

Về cơ bản, nếu bạn nói nonatomicvà bạn tạo ra các bộ truy cập bằng cách sử dụng @synthesize, thì nếu nhiều luồng cố gắng thay đổi / đọc thuộc tính cùng một lúc, điều xấu có thể xảy ra. Bạn có thể nhận được các giá trị được viết một phần hoặc các đối tượng được giải phóng / giữ lại quá mức, điều này có thể dễ dàng dẫn đến sự cố. (Tuy nhiên, điều này có khả năng nhanh hơn rất nhiều so với một công cụ truy cập nguyên tử.)

Nếu bạn sử dụng mặc định (nghĩa là atomic, trước đây không có từ khóa nào cho việc này, nhưng hiện tại ), thì các @synthesizephương thức d sử dụng khóa cấp đối tượng để đảm bảo rằng nhiều lần đọc / ghi vào một thuộc tính được nối tiếp. Như các tài liệu của Apple chỉ ra, điều này không có nghĩa là toàn bộ đối tượng là an toàn cho luồng , nhưng các thuộc tính riêng lẻ đọc / ghi là.

Tất nhiên, nếu bạn triển khai các bộ truy cập của riêng bạn thay vì sử dụng @synthesize, tôi nghĩ các tuyên bố này không làm gì ngoài việc thể hiện ý định của bạn về việc liệu tài sản có được thực hiện theo cách an toàn không.


7
Tôi thích câu trả lời này - ít gây nhầm lẫn, đơn giản và đầy đủ hơn mà những người tìm thấy ở nơi khác!
PapillonUK

Thực sự tuyệt vời và ít gây nhầm lẫn (+1) nhưng bạn có thể vui lòng cho biết tại sao phi nguyên tử có khả năng nhanh hơn nhiều so với bộ truy cập nguyên tử không?
Chúc

2
@Wish Bộ truy cập không nguyên tử có thể nhanh hơn vì để ngăn các luồng khác đọc / ghi cùng một lúc, bạn cần giữ một mutex hoặc thực hiện một số thủ thuật cấp thấp khác làm tốn thời gian của CPU. Nếu bạn đang sử dụng khóa, bạn cũng có thể bị chặn trên các luồng khác, điều này cũng mất thời gian.
Jesse Rusak

1
@Rob Bạn có thể muốn hỏi một câu hỏi mới về điều đó.
Jesse Rusak

1
@Pratik Xin lỗi, điều đó không đúng. Câu trích dẫn mà bạn trình bày đang nói chính xác điều tương tự tôi đã làm: việc tạo một tài sản atomictránh được sự cố trong khi truy cập các thuộc tính riêng lẻ nhưng không đảm bảo rằng toàn bộ đối tượng (tức là truy cập các thuộc tính riêng biệt như tên và họ) sẽ làm Điều đúng đắn.
Jesse Rusak

46

Sau khi đọc rất nhiều bài viết và bài đăng StackOverflow và đã tạo các ứng dụng demo để kiểm tra các thuộc tính thuộc tính Biến, tôi quyết định đặt tất cả các thông tin thuộc tính lại với nhau

  1. nguyên tử // mặc định
  2. nonatomic
  3. mạnh = giữ lại // mặc định
  4. yếu = không an toàn_unretained
  5. giữ lại
  6. gán // mặc định
  7. không an toàn_unretained
  8. bản sao
  9. chỉ đọc
  10. đọc / ghi mặc định

Vì vậy, bên dưới là liên kết bài viết chi tiết nơi bạn có thể tìm thấy ở trên đã đề cập tất cả các thuộc tính, điều đó chắc chắn sẽ giúp bạn. Rất cám ơn tất cả những người đã đưa ra câu trả lời tốt nhất ở đây !!

Thuộc tính hoặc biến đổi thuộc tính trong iOS

  1. nguyên tử
    • Nguyên tử có nghĩa là chỉ có một luồng truy cập biến (kiểu tĩnh).
    • Nguyên tử là chủ đề an toàn.
    • Nhưng nó là hiệu suất chậm.
    • Nguyên tử là hành vi mặc định.
    • Các bộ truy cập nguyên tử trong môi trường không được thu gom rác (tức là khi sử dụng giữ lại / giải phóng / tự động chạy) sẽ sử dụng khóa để đảm bảo rằng một luồng khác không can thiệp vào cài đặt / nhận giá trị chính xác.
    • nó không thực sự là một từ khóa

Thí dụ :

@property (retain) NSString *name;

@synthesize name;
  1. nonatomic
    • Nonatomic có nghĩa là nhiều luồng truy cập biến (kiểu động).
    • Nonatomic là chủ đề không an toàn.
    • Nhưng nó là nhanh trong hiệu suất.
    • Nonatomic KHÔNG phải là hành vi mặc định; chúng ta cần thêm từ khóa nonatomic trong thuộc tính.
    • nó có thể dẫn đến hành vi không mong muốn, khi hai quá trình (luồng) khác nhau truy cập cùng một biến cùng một lúc.

Thí dụ:

@property (nonatomic, retain) NSString *name;

@synthesize name;

12

Ngoài những gì đã được nói về tính linh hoạt, tính chất phi nguyên tử còn nhanh hơn các bộ truy cập nguyên tử. Đó không phải là điều bạn thường phải lo lắng, nhưng hãy ghi nhớ nó. Các thuộc tính được tạo ra Dữ liệu cốt lõi là một phần không vì lý do này.


9

Trong một chương trình đa luồng, một hoạt động nguyên tử có thể bị gián đoạn một phần thông qua, trong khi các hoạt động phi nguyên tử có thể.

Do đó, bạn nên sử dụng mutexes (hoặc một cái gì đó tương tự) nếu bạn có một hoạt động quan trọng không gây dị ứng mà bạn không muốn bị gián đoạn.


8

Nếu bạn chỉ định "nguyên tử", các hàm truy cập được tạo có một số mã bổ sung để bảo vệ chống lại các cập nhật đồng thời.


6

Thông thường nguyên tử có nghĩa là ghi / đọc vào tài sản xảy ra như một hoạt động đơn lẻ. Nguyên tử


2

Bạn có thể có thể xử lý những thứ này bằng cách đọc bài viết dưới đây.

Giải thích với mục đích của nonatomic

nonatomic - Không phải chủ đề an toàn

nguyên tử - Chủ đề an toàn - Đây là thuộc tính mặc định.


1
Bạn có chắc chắn điều đó không ngược lại? Tính chất nguyên tử an toàn nhưng tính chất không gây dị ứng không an toàn. Lần trước tôi đã kiểm tra nó là như thế: P
David Rönnqvist

0

Các "nguyên tử” có nghĩa rằng quyền truy cập vào tài sản là thread-safe. Trong khi 'nonatomic' là trái ngược với nó. Khi bạn khai báo một tài sản trong Objective-C bất động sản là nguyên tử theo mặc định để accessors tổng hợp cung cấp truy cập mạnh mẽ đến bất động sản Trong môi trường đa luồng, đó là giá trị được trả về từ getter hoặc được đặt qua setter luôn được truy xuất đầy đủ hoặc được đặt bất kể các luồng nào khác đang thực thi đồng thời. Nhưng nếu bạn khai báo thuộc tính là không tương tự như bên dưới

@property (nonatomic, retain)  NSString *myString;

sau đó nó có nghĩa là một bộ truy cập tổng hợp cho một thuộc tính đối tượng chỉ đơn giản trả về giá trị trực tiếp. Tác dụng của thuộc tính nonatomic phụ thuộc vào môi trường. Theo mặc định, các bộ truy cập tổng hợp là nguyên tử. Vì vậy, nonatomic nhanh hơn đáng kể so với nguyên tử.


-2

Một là cho nhiều chủ đề. Một không


IMHO: Để có được bất kỳ upvote nào, bạn cần phải cụ thể hơn và dành thời gian cho việc viết câu trả lời của bạn.
Johan Karlsson
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.