Atom və qeyri-atom xüsusiyyətləri arasındakı fərq nədir?

Əmlak bəyannamələrində atomicnonatomic nə deməkdir?

 @property(nonatomic, retain) UITextField *userName; @property(atomic, retain) UITextField *userName; @property(retain) UITextField *userName; 

Bu üç arasında əməliyyat fərq nədir?

1765
26 февр. Alex Wayne tərəfindən 26 Fevralda təyin olundu 2009-02-26 05:31 '09 at 5:31 am 2009-02-26 05:31
@ 30 cavab

Son ikisi eynidır; "atom" default davranışdır ( ), lakin bu bir açar söz deyil, lakin nonatomic atomic olmaması son versiyalarda llvm / c>

Yöntəmin tətbiqi @ synthesizing olduğunuzu düşünsəniz, atom və ya nonatomik yaradılan kodu dəyişir. Öz setter / alıcınızı yazarkən, atom / natomik olmayan / qənaət / təyin / kopyalamaq yalnız bir təklifdir. (Qeyd: @synthesize indi LLVM'nin son versiyalarında default davranışdır. Məsələn dəyişənlərin elan edilməsinə ehtiyac yoxdur, onlar da avtomatik olaraq sintez edilir və təsadüfən birbaşa çıxışın qarşısını almaq üçün adlarına əlavə olunacaq).

"Atom" ilə, sintez edilmiş setter / qəbuledici tam dəyərin qəbuledicidən hər zaman geri qaytarılmasını və ya quraşdırıcının digər axında təyinatçının fəaliyyətindən asılı olmayaraq müəyyən edilir. Yəni əgər A tapançasının alıcısının ortasında olarsa, B işarəsi təyin ediciyə çağırır, əsl canlı qiymət avtomatik olaraq həyata keçirilmiş obyektin A-da çağırana qaytarılacaqdır.

nonatomic bu cür zəmanətlər təmin edilmir. Beləliklə, nonatomic əhəmiyyətli dərəcədə daha sürətli olur.

"Atom" etməyən şey axınların təhlükəsizliyi üçün bütün zəmanətlər verir. A tapşırığı Alıcıyı fərqli dəyərlərlə çağırır, B və C axını eyni zamanda çağırırsa, A axını üç qaytarılmış dəyərdən hər hansı birini ala bilər - adlandırılan biri və ya B və C-də yerləşdirənlərə ötürülən hər hansı dəyərlər. B və ya C-dən dəyərini ifadə etmədən.

Məlumatların bütövlüyünü təmin etmək, digər vasitələrlə əldə edilən çox işıqlı proqramlaşdırmanın əsas məqsədlərindən biridir.

Buna əlavə olaraq:

Bir əmlakın atomicity oyunda bir neçə asılı xüsusiyyətlər oynandığında bir axının təhlükəsizliyini təmin edə bilməz.

Düşün:

  @property(atomic, copy) NSString *firstName; @property(atomic, copy) NSString *lastName; @property(readonly, atomic, copy) NSString *fullName; 

Bu halda, mövzu A setFirstName: çağıraraq obyektin adını dəyişə bilər və sonra setLastName: çağırır setLastName: Bu arada, mövzu B, iki A fullName ilə A arasına fullName bilər və köhnə soyadı ilə birlikdə yeni bir ad alacaq.

Bu problemi həll etmək üçün bir əməliyyat modelinə ehtiyacınız var. Yəni, asılı xüsusiyyətləri yeniləyərkən, fullName daxil olmaq istisna olmaqla, bəzi digər sinxronizasiya növləri və / və ya istisnalar.

1700
26 февр. cavab fevralın 26-da bbum tərəfindən verilir . 2009-02-26 09:40 '09 at 9:40 'da 2009-02-26 09:40

Bu, Apple sənədlərində izah edilir, lakin aşağıda həqiqətən baş verən bəzi nümunələrdir. "Atom" sözü olmadığını unutmayın, əgər "qeyri-metrik" deyilsə, o zaman atom atomdur, ancaq "atom" ifadəsi səhv olur.

 //@property(nonatomic, retain) UITextField *userName; //Generates roughly - (UITextField *) userName { return userName; } - (void) setUserName:(UITextField *)userName_ { [userName_ retain]; [userName release]; userName = userName_; } 

İndi atom versiyası bir az daha mürəkkəbdir:

border=0
 //@property(retain) UITextField *userName; //Generates roughly - (UITextField *) userName { UITextField *retval = nil; @synchronized(self) { retval = [[userName retain] autorelease]; } return retval; } - (void) setUserName:(UITextField *)userName_ { @synchronized(self) { [userName_ retain]; [userName release]; userName = userName_; } } 

Prinsipcə, atom versiyası axının təhlükəsizliyini təmin etmək üçün blokaj etməlidir və həmçinin zənginləşdirilmiş bir obyektin zəng edən üçün mövcud olduğu obyektin (və autoresist hesabını) balanslaşdırma sayını atır, əks halda başqa bir mövzu dəyəri təyin edərsə potensial yarış vəziyyəti mövcuddur sayma refinin 0-ə sıfırlanmasına səbəb olur.

Əslində, bu xüsusiyyətlərin xüsusiyyətləri skaler dəyərlər və ya obyektlərin olub-olmadığını və necə saxlamaq, kopyalamaq, oxumaq, atomik olmayan və s. qarşılıqlı əlaqə. Ümumiyyətlə, xüsusiyyətlərin sintezatorları sadəcə bütün kombinasiyalar üçün "doğru" şeyləri necə edəcəyini bilirlər.

350
26 февр. Fevralın 26-da Louis Gerbarq tərəfindən verilmiş cavab . 2009-02-26 09:24 '09 9:24 am 2009-02-26 09:24

Atom

  • - default davranış
  • başqa bir proses dəyişənə çatmadan əvvəl cari prosesin CPU tərəfindən tamamlanmasını təmin edir
  • prosesi tamamilə tamamladığı üçün sürətli deyil

qeyri-təbii

  • ƏSASLI davranış deyil.
  • daha sürətli (sintez edilmiş kod üçün, yəni @property və @ synthesize istifadə edərək yaradılan dəyişənlər üçün)
  • təhlükəsiz iş deyil
  • iki fərqli proses eyni dəyişənə eyni anda daxil olduqda gözlənilməz davranışa səbəb ola bilər
152
25 мая '12 в 13:56 2012-05-25 13:56 cavab xam3d 25 may '12 saat 13:56 'də verilir 2012-05-25 13:56

Fərqi anlamaq üçün ən yaxşı şəkildə aşağıdakı nümunəni istifadə etməkdir.

"Ad" adlanan bir atom simli əmlakı olduğunu və [self setName:@"A"] dan [self setName:@"A"] [self setName:@"B"] dən [self setName:@"B"] çağırın və [self name] C axını, sonra fərqli mövzuları olan bütün əməliyyatlar birbaşa həyata keçiriləcəkdir, yəni bir mövzu təyin ediciyi və ya alıcıyı yerinə yetirirsə, digər iplər gözləməlidir.

Bu "ad" mülkiyyətini oxumaq / yazma üçün təhlükəsiz edir, amma başqa bir mövzu D, eyni zamanda [name release] çağırırsa, bu əməliyyat baş verə bilər, çünki heç bir setter / getter çağırışı yoxdur. Bu, obyektin okuma-yazma təhlükəsizliyidir (ATOMIC), lakin digər mövzuların eyni zamanda obyektin hər hansı bir növü mesajını göndərə biləcəyi üçün iş parçacığı ilə təhlükəsiz deyildir. Geliştirici bu cür obyektlərin ipliklərinin təhlükəsizliyini təmin etməlidir.

Əgər "ad" mülkiyyəti qeyri-matik olmasa, yuxarıda göstərilən nümunələrdə - A, B, C və D-nin bütün axınları gözlənilməz nəticələrin alınması ilə eyni vaxtda həyata keçiriləcəkdir. Bir atom vəziyyətində, A, B və ya C biri əvvəl icra edilir, lakin D paralel olaraq icra edilə bilər.

128
31 янв. Cavab 31 yanvar Vijayendra verilir 2012-01-31 21:36 '12 at 21:36 2012-01-31 21:36

Sintaksis və semantiklər bu sualın digər əla cavabları ilə artıq müəyyənləşdirilmişdir. Tətbiq və performans çox ətraflı deyil, mən cavab əlavə edəcək.

Bu 3 arasında funksional fərq nədir?

Mən adətən çox maraqlı olduqda atom hesab edirəm. Abstraksiya səviyyəsində, 100% akış qorunmasına nail olmaq üçün bir vasitə kimi bir sinif üçün atom xüsusiyyətlərini istifadə edirik. Həqiqətən yaxşı qurulmuş çox işıqlı proqramlar üçün proqramçı müdaxiləsi demək olar ki, bir şərtdir. Eyni zamanda, performansın xüsusiyyətləri və performansı hələ ətraflı öyrənilməmişdir. Yıllar boyu bir neçə çox işıqlı proqram nonatomic , həmişə mənim xüsusiyyətləri nonatomic olaraq elan etdilər, çünki atom heç bir məqsədi məqbul nonatomic . Bu sualın atom və qeyri-atomik xüsusiyyətlərinin detallarını müzakirə edərkən bəzi maraqlı nəticələrlə qarşılaşdığım bəzi profilləri düzəldirdim.

İcra

Tamam. Mənə aydınlıq gətirmək istərdim ki, kilidlərin tətbiqi müəyyənləşdirilib və özünəməxsusdur. Louis öz nümunəsində @synchronized(self) istifadə edir - mən bunu ümumi qarışıqlıq mənbəyi kimi gördüm. Tətbiq əslində @synchronized(self) istifadə etmir; bir obyekt səviyyəsində kilidi istifadə edir. Louis təsvirləri yüksək səviyyəli illüstrasiyalar üçün yaxşı uyğundur, biz hamımızın tanış olduğumuz konstruktları istifadə edir, amma bunun @synchronized(self) istifadə etmədiyini bilmək vacibdir.

Başqa bir fərq, atom xüsusiyyətləri alıcı içərisində cisimlərinizin dövrünü saxlayacaqdır.

Performans

Burada maraqlı bir hissəsidir: bəzi hallarda atom maddələrindən istifadə edilməməsi mümkünsüz (məsələn, tək yivli) hallarda çox sürətli ola bilər. Daha az ideal vəziyyətdə, nonatomic xidmət məlumatlarına görə, nonatomic girişin istifadəsi 20-dən çox xərclənə bilər. 7 axın istifadə edərək Dəyişən arqument üç baytlı struktur üçün 44 dəfə daha yavaş olsa da (2.2 GHz Core i7 Quad Core, x86_64). Üç bəndli quruluş çox yavaş bir əmlakın nümunəsidir.

Maraqlı bir qeyd: üç baytlı strukturun istifadəçi təchizatçıları sintez olunan atom əlavələrindən 52 dəfə daha sürətli idi; və ya 84% - sentez olunan qeyri-atomik aksesuarların sürəti.

Mübahisəli hallarda obyektlər də 50 dəfədən çox ola bilər.

Tətbiqlərdə optimallaşdırma və dəyişikliklərin sayından asılı olaraq, bu kontekstlərdə real dünyanın təsirini ölçmək çox çətindir. Tez-tez "Əgər bir profiliniz yoxdursa və ona bu problem olmadığını etsəniz, ona etibar et" kimi bir şey eşitəcəksiniz. Abstraksiya səviyyəsinə görə faktiki təsiri ölçmək həqiqətən çətindir. Profillerin faktiki xərclərinin yox olması çox vaxt çəkə bilər və abstractions sayəsində qeyri-dəqiqdir. Bundan əlavə, ARC vs MRC böyük fərq edə bilər.

Beləliklə, giriş imkanının tətbiqinə diqqət objc_msgSend bir addım geri objc_msgSend , objc_msgSend kimi adi şübhəlilər daxil edəcəyik və müzakirə edilən hallarda NSString objc_msgSend bir neçə çağırış üçün bir neçə real yüksək səviyyəli nəticəni nəzərdən keçirək:

  • MRC | nonatomik | alıcılar əllə həyata keçirilir: 2
  • MRC | nonatomik | sentezli alıcı: 7
  • MRC | atom | sentezli alıcı: 47
  • ARC | nonatomik | synthesized getter: 38 (qeyd: ARC bir sayma dövrü əlavə edir)
  • ARC | atom | sentezli alıcı: 47

Yəqin ki, təxmin etdiyimiz kimi, atomlara və ARK-a əhəmiyyətli qatqıların counter / cyclicity fəaliyyəti. Çatışmalı hallarda böyük fərqlər də görəcəksiniz.

Performansa diqqət yetirməli olmasına baxmayaraq, mən Semantikləri ilk dəfə deyirəm ! . Bununla yanaşı, məhsuldarlıq bir çox layihələr üçün aşağı prioritetdir. Bununla belə, performansın detallarını və istifadə etdiyiniz texnologiyaların dəyərini bilmək əlbəttə ki, zərər vermir. Sizin ehtiyaclarınız, məqsədləriniz və qabiliyyətləriniz üçün doğru texnologiyadan istifadə etməlisiniz. Ümid edirəm ki, bu, bir neçə saatlıq müqayisələrinizi xilas edəcək və proqramlarınızı inkişaf etdirərkən daha məlumatlı qərar qəbul etməyə kömək edəcəkdir.

109
18 авг. Cavab yalnız 18 avqust verildi . 2012-08-18 12:47 '12 at 12:47 2012-08-18 12:47

Atom = axın təhlükəsizliyi

Nonatomic = axın təhlükəsizliyi

İşin təhlükəsizliyi:

Instance dəyişənləri, işləmə müddəti və əlavə sinxronizasiya etmədən və ya zəng kodunun tərəfindən digər koordinasiya etmədən planlaşdırma və dəyişdirilmədən asılı olmayaraq, birdən çox iş parçacığından istifadə edildikdə düzgün davranarsalar, işlək vəziyyətə salınırlar.

Bizim kontekstdə:

Bir stream bir nümunənin dəyərini dəyişdirsə, dəyişdirilən dəyər bütün mövzuları üçün istifadə edilə bilər və yalnız bir mövzu dəyərini bir anda dəyişə bilər.

Atomdan istifadə etmək üçün:

Məsələn dəyişən çox işıqlı bir mühitdə mövcuddur.

atomic çıxışı:

nonatomic kimi sürətli deyil, çünki nonatomic icra edildiyi andan etibarən hər hansı bir nəzarətçi hərəkətini tələb etmir.

nonatomic yerlər:

Məsələn dəyişən bir neçə mövzu ilə dəyişdirilməyibsə, onu istifadə edə bilərsiniz. Performansı yaxşılaşdırır.

92
10 июля '13 в 16:07 2013-07-10 16:07 Cavab Durai Amuthan.H tərəfindən verilir. 10 iyul 'da 16:07' da 2013-07-10 16:07

Buradakı atom və qeyri-nüvə xüsusiyyətləri olduqca yaxşı bir izahat tapdım. Eyni bir neçə müvafiq mətn:

"atom" sınıq olmadığını bildirir. OS / proqramlaşdırma baxımından bir atom funksiyası çağırışı kəsilemeyen bir şeydir - bütün funksiya yerinə yetirilməlidir və tamamlanmadan əməliyyat sisteminin kontekstinin adi keçməsi ilə CPU-dan boşaltılmamalıdır. Yalnız bildiyiniz halda: prosessor yalnız bir də olsa da, OS çox müddətli illüziyanın yaranması üçün kiçik müddət dilimində çalışan proseslərə prosessora giriş imkanı verir. Protsessor planlayıcısı prosesin istifadəsi zamanı istənilən vaxt (hətta bir funksiya çağırışının ortasında) kəsə bilər. Buna görə də, ümumi hesablanan dəyişənlərin yenilənməsi kimi tədbirlər üçün, iki proses eyni vaxtda bir dəyişənliyi yeniləmək üçün cəhd edəndə, onlar "atomik" olaraq yerinə yetirilməlidir. Hər bir yeniləmə hərəkatı CPU üçün hər hansı digər prosesi dəyişdirə bilərdən əvvəl tamamilə bitməli olmalıdır.

Beləliklə, bu halda atomun atribut oxu üsullarının kəsilməsinə gətirib çıxara bilməyəcəyini bildirirəm - əslində, bu üsulla oxunan dəyişən (dəyişən) dəyərini yarım dəyişə bilməz, çünki başqa bir mövzu / çağırış / CPU üzrə funksiya swapları.

atomic dəyişənlərinin kəsilməsinə baxmayaraq, hər hansı bir nöqtədə olan dəyəri bir zəmanətdir , baxmayaraq ki, bu axının bloklanması onlara daha yavaş çıxır. Digər tərəfdən, non-atomic dəyişənlər belə bir zəmanət vermirlər, ancaq daha sürətli girişi lüks təklif edirlər. Çıxarmaq üçün, dəyişənləriniz birdən çox mövzuya eyni vaxtda çıxmayacağını və prosesi sürətləndirəcəyini bildiyiniz zaman non-atomic ilə gedin.

67
24 февр. cavab verildi tipycalFlow 24 fevral. 2012-02-24 08:17 '12 at 8:17 am 2012-02-24 08:17

Bir çox məqaləni oxuduqdan sonra, yığma daşmaları və dəyişən xassələrin xüsusiyyətlərini yoxlamaq üçün demo tətbiqləri yaratdıqdan sonra bütün xüsusiyyətləri bir yerə qoymağa qərar verdim:

  • atomic / default
  • nonatomic
  • strong = retain / default
  • weak = unsafe_unretained
  • retain
  • default olaraq // assign
  • unsafe_unretained
  • copy
  • readonly
  • readwrite / default

Məqalədə, iOS -un əmlak xüsusiyyətləri və ya mülkiyyət dəyişdiriciləri , yuxarıda göstərilən bütün xüsusiyyətləri tapa bilərsiniz və bu, mütləq sizə kömək edəcəkdir.

  • atomic

    • atomic yalnız bir ipin bir dəyişən (statik tip) daxil olmasını nəzərdə tutur.
    • atomic təhlükəsiz bir mövzu.
    • Amma performansda yavaş
    • atomic - default davranış
    • Atrof-çuxursuz bir mühitdə (məsələn, qazanc / azad / avto-reklam vasitəsi ilə) istifadə olunan digər atributlar digər axının dəyərin düzgün qurulmasına / əldə edilməsinə mane olmur.
    • Bu bir söz deyil.

    Məsələn:

      @property (retain) NSString *name; @synthesize name; 
  • nonatomic

    • nonatomic bir çox mövzuya bir dəyişən (dinamik tip) daxil nonatomic deməkdir.
    • nonatomic təhlükəlidir.
    • Amma sürətli işləyir.
    • nonatomic default olaraq işləmir. nonatomic sözü mülkiyyət xüsusiyyətinə əlavə etmək lazımdır.
    • Bu iki fərqli proses eyni vaxtda eyni dəyişkənliyə çatdıqda gözlənilməz davranışa gətirib çıxara bilər.

    Məsələn:

      @property (nonatomic, retain) NSString *name; @synthesize name; 
63
21 марта '13 в 10:10 2013-03-21 10:10 Cavab verilir swiftBoy 21 Mart '13 10:10 2013-03-21 10:10

Atom:

Atom, mülkiyyətə girişin atomik bir şəkildə ediləcəyini təmin edir. Məsələn, hər zaman tamamilə başlanğıc edilmiş obyektləri qaytarır, bir mövzu içində hər hansı bir almaq / müəyyən xüsusiyyət digərinə çatmadan əvvəl tamamlanmalıdır.

Eyni anda iki mövzu üzərində meydana gələn aşağıdakı funksiyanı təsəvvür etsəniz, nəticələrin niyə yaxşı olmayacağını anlaya bilərsiniz.

 -(void) setName:(NSString*)string { if (name) { [name release]; // what happens if the second thread jumps in now !? // name may be deleted, but our 'name' variable is still set! name = nil; } ... } 

Artıq : Tam işə salınan obyektlərin hər dəfə qaytarılması multithreading halda ən yaxşı seçimdir.

Eksiler: Performansın azalması bir az yavaş yerinə yetirir

Nonatomik:

Atomdan fərqli olaraq, hər dəfə obyektin tamamilə təyin edilmiş qaytarılmasını təmin etmir.

Pros: Çox sürətli icra.

Eksiler: Çoxsaylı işləmə halında zibillərin xərclərinin şansları.

52
26 февр. Cavab Andrew Grant tərəfindən verilir 26 fevral. 2009-02-26 05:41 '09 at 5:41 am 2009-02-26 05:41

Ən sadə cavab: ikinci iki misal arasında heç bir fərq yoxdur. Varsayılan olaraq, mülk sahibləri atomdur.

Atomik təchizatçıları, zibil içerməyən bir mühitdə (yəni, qazanc / azad / avtomatik reklamdan istifadə edərkən) digər axının dəyərin düzgün qurulmasına / əldə edilməsinə mane olmadığı üçün bir kilidi istifadə edəcəkdir.

Daha çox işlənmiş proqramları qurarkən daha ətraflı məlumat və digər mülahizələr üçün Apple Objective-C 2.0 sənədlərinin " Performans və Akışlar " bölümünə baxın.

52
26 февр. Cavab 26 fevralda Jay O'Conor tərəfindən verilir . 2009-02-26 05:56 '09 saat 05:56 'da 2009-02-26 05:56

Atom yalnız bir ipin bir dəyişənə (statik tip) daxil olmasını nəzərdə tutur. Atom təhlükəsizdir, amma yavaş.

Nonatomik, birdən çox mövzuya bir dəyişən (dinamik tip) aid olduğunu bildirir. Nonatomic - təhlükəli axın, ancaq sürətli.

31
22 нояб. Cavab noyabrın 22-də IOS Rocks tərəfindən verilir . 2012-11-22 14:20 '12 at 2:20 pm 2012-11-22 14:20

Atom yalnız bir ipin bir dəyişənə (statik tip) daxil olmasını nəzərdə tutur.

  • Atom təhlükəsizdir.
  • Amma performansda yavaş
  • Atomik əsl davranışdır.
  • Atomik təchizatçıları, zibil içerməyən bir mühitdə (yəni qazanc / azad / abstrakt istifadə edərkən) başqa bir mövzu dəyərin düzgün qəbulu / alınmasına müdaxilə etməməsini təmin etmək üçün bir kilidi istifadə edəcəkdir.
  • bu bir söz deyil.

Məsələn:

 @property (retain) NSString *name; @synthesize name; 

Nonatomik , birdən çox mövzuya bir dəyişən (dinamik tip) aid olduğunu bildirir.

  • Nonatomik - təhlükəli axın.
  • Amma sürətli işləyir.
  • Nonatomik, default davranış deyil, əmlak niteliğine qeyri-atomik bir söz əlavə etmək lazımdır.
  • Bu iki fərqli proses (iş parçaları) eyni dəyişənə eyni anda daxil olduqda gözlənilməz davranışa gətirib çıxara bilər.

Məsələn:

 @property (nonatomic, retain) NSString *name; @synthesize name; 

Mən izah edirəm:

"Adı" adlanan bir atom simli əmlakı olduğunu və "A" dan [self setName: @ "A"] çağırırsanız,

B iş parçacığından [self setName: @ "B"] zəng edin və "C" dan özünü [öz adını] çağırın, digər mövzuya aid bütün əməliyyatlar birbaşa icra olunacaq, yəni bir mövzu bir setter və ya alıcıyı işlədirsə, . Bu, adın oxumaq / yazma üçün təhlükəsiz olmasını təmin edir, amma başqa bir mövzu D, eyni zamanda [azad adı] çağırırsa, bu əməliyyat bir qəzaya səbəb ola bilər, çünki heç bir setter / getter çağırışı yoxdur. Bu, obyektin okuma-yazma təhlükəsizliyidir (ATOMIC), lakin digər mövzuların eyni zamanda obyektin hər hansı bir növü mesajını göndərə biləcəyi üçün iş parçacığı ilə təhlükəsiz deyildir. Geliştirici bu cür obyektlərin ipliklərinin təhlükəsizliyini təmin etməlidir.

Əgər "ad" mülkiyyəti qeyri-matik olmasa, yuxarıda göstərilən nümunələrdə - A, B, C və D-nin bütün axınları gözlənilməz nəticələrin alınması ilə eyni vaxtda həyata keçiriləcəkdir. Bir atom vəziyyətində, A, B və ya C biri əvvəl icra edilir, lakin D paralel olaraq icra edilə bilər. - Ətraflı:

İndi bir neçə şərhimiz var:

Атомный и неатомный относится к тому, будут ли сеттеры/геттеры для свойства атомарно читать и записывать значения в свойство. Когда ключевое слово атома используется для свойства, любой доступ к нему будет "синхронизирован". Поэтому при вызове геттера будет гарантировано возвращать действительное значение, однако это происходит с небольшим штрафом за производительность. Следовательно, в некоторых ситуациях неатомический используется для обеспечения более быстрого доступа к свойству, но есть вероятность того, что условие гонки приведет к тому, что свойство окажется равным нулю при редких обстоятельствах (когда значение задается из другого потока, а старое значение было выпущено из памяти, но новое значение еще не было полностью привязано к местоположению в памяти для свойства).

15
ответ дан Vishu 02 дек. '17 в 23:01 2017-12-02 23:01

Atomic потокобезопасен , он медленный , и он обеспечивает (не гарантируется) , что предоставляется только заблокированное значение независимо от того, сколько потоков пытается получить доступ к одной и той же зоне. При использовании атома кусок кода, написанный внутри этой функции, становится частью критического раздела, к которому может выполняться только один поток за раз.

Это только гарантирует безопасность потока; это не гарантирует этого. Я имею в виду, что вы нанимаете опытного водителя для своей машины, но это не гарантирует, что автомобиль не встретит аварии. Однако вероятность остается малейшей.

Atomic - его нельзя разбить, поэтому ожидается результат. С неатомным - когда другой поток обращается к зоне памяти, он может изменить его, поэтому результат неожиданно.

Обсуждение кода:

Atomic make getter и setter потока свойств безопасен. например, если u написано:

 self.myProperty = value; 

является потокобезопасным.

 [myArray addObject:@"Abc"] 

НЕ является потокобезопасным.

14
ответ дан user3693546 07 июля '15 в 12:56 2015-07-07 12:56

Нет такого ключевого слова "atomic"

 @property(atomic, retain) UITextField *userName; 

Мы можем использовать выше, как

 @property(retain) UITextField *userName; 

См. вопрос Я получаю проблемы, если я использую @property (атомный, сохраняю) NSString * myString .

12
ответ дан Deepak 08 нояб. '11 в 8:41 2011-11-08 08:41

по умолчанию - atomic , это означает, что он будет стоить вам производительности, когда вы используете это свойство, но это потокобезопасно. Что делает Objective-C, устанавливается блокировка, так что только фактический поток может получить доступ к переменной, если выполняется setter/getter.

Пример с MRC свойства с ivar _internal:

 [_internal lock]; //lock id result = [[value retain] autorelease]; [_internal unlock]; return result; 

Итак, эти последние два одинаковы:

 @property(atomic, retain) UITextField *userName; @property(retain) UITextField *userName; // defaults to atomic 

С другой стороны, nonatomic ничего не добавляет к вашему коду. Таким образом, только безопасный поток, если вы сами кодируете механизм безопасности.

 @property(nonatomic, retain) UITextField *userName; 

Ключевые слова не обязательно должны быть записаны как первый атрибут свойства.

Не забывайте, это не означает, что свойство в целом является потокобезопасным. Вызывается только вызов метода setter/getter. Но если вы используете сеттер, и после этого геттер одновременно с двумя разными потоками, он тоже может быть сломан!

11
ответ дан Binarian 27 сент. '13 в 12:43 2013-09-27 12:43

atomic (по умолчанию)

Atomic по умолчанию: если вы ничего не набираете, ваше свойство атомное. Атомное свойство гарантируется, что если вы попытаетесь прочитать он вернет действительное значение. Он не дает никаких гарантий о том, что это за значение, но вы вернете хорошие данные, а не просто мусорная память. Это позволяет вам сделать это, если у вас есть несколько потоков или нескольких процессов, указывающих на одну переменную, одну поток может читать, а другой поток может писать. Если они попадут в то же самое время чтения нити гарантированно получат одно из двух значений: либо до изменения, либо после изменения. Что атомное не дать вам любую гарантию о том, какие из этих ценностей вы может стать. Atomic действительно часто путают с потокобезопасностью, и это неверно. Вам необходимо гарантировать безопасность потока другими способами. Однако атомный будет гарантировать, что если вы попытаетесь прочитать, вы возвращаете какую-то ценность.

qeyri-təbii

С другой стороны, неатомный, как вы можете догадаться, просто означает, "Не делай этого атомного материала". То, что вы теряете, является гарантией того, что вы всегда возвращай что-то. Если вы попытаетесь прочитать в середине напишите, вы можете вернуть данные мусора. Но, с другой стороны, вы идете немного быстрее. Потому что атомарные свойства должны делать какую-то магию чтобы вы вернули стоимость, они немного медленнее. Если это свойство, к которому вы обращаетесь много, вы можете отказаться вниз до неатомического, чтобы убедиться, что вы не выполняете эту скорость штраф.

Подробнее здесь: https://realm.io/news/tmi-objective-c-property-attributes/

9
ответ дан Proton 23 июля '16 в 9:34 2016-07-23 09:34

Если вы используете свое свойство в многопоточном коде, вы сможете увидеть разницу между неатомическими и атомными атрибутами. Неатомный быстрее, чем атомный, а атомный - поточно-безопасный, а не неатомный.

Vijayendra Tripathi уже привел пример для многопоточной среды.

8
ответ дан Ankul Gaur 13 авг. '14 в 14:57 2014-08-13 14:57
  • -Atomic означает, что только один поток обращается к переменной (статический тип).
  • -Atomic безопасен потоком.
  • - но это медленная производительность

Как объявить:

Как атомный по умолчанию, поэтому,

 @property (retain) NSString *name; 

И в файле реализации

 self.name = @"sourov"; 

Предположим, что задача, связанная с тремя свойствами:

  @property (retain) NSString *name; @property (retain) NSString *A; @property (retain) NSString *B; self.name = @"sourov"; 

Все свойства работают параллельно (например, асинхронно).

Если вы вызываете "имя" из потока A ,

В то же время, если вы вызываете

 [self setName:@"Datta"] 

из потока B ,

Теперь Если свойство name неатомное , то

  • Он вернет значение "Датта" для A
  • Он вернет значение "Datta" для B

Вот почему не атомный называется потоком небезопасным Но, но он быстро работает из-за параллельного выполнения

Теперь If * свойство name является атомарным

  • Это обеспечит значение "Суров" для A
  • Затем он вернет значение "Datta" для B

То, почему атом называется thread Safe и Что называется безопасным для чтения и записи

Такая ситуационная операция будет выполняться серийно. И медленная производительность

- Nonatomic означает, что несколько потоков обращаются к переменной (динамический тип).

- неатомный поток небезопасен.

- но он быстро работает

-Nonatomic не является поведением по умолчанию, нам нужно добавить неатомическое ключевое слово в атрибуте свойства.

Для Быстрого Подтверждая, что свойства Swift неатомичны в смысле ObjC. Одна из причин заключается в том, что вы думаете о том, достаточно ли атомарности для каждой из ваших потребностей.

Ссылка: https://forums.developer.apple.com/thread/25642

Fro больше информации, пожалуйста, посетите веб-сайт http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

8
ответ дан Shourob Datta 13 дек. '16 в 6:27 2016-12-13 06:27

Прежде чем обсуждать атрибуты @property, вы должны знать, что такое использование @property. @property предлагает способ определения информации, которую класс должен инкапсулировать. Если вы объявляете объект/переменную с помощью @property, то этот объект/переменная будет доступен для других классов, импортирующих его класс. Если вы объявляете объект с использованием @property в файле заголовка, вам необходимо его синтезировать с помощью @synthesize в файле реализации.

Məsələn:

.h class

 @interface ExampleClass : NSObject @property (nonatomic, retain) NSString *name; @end 

.m class

 @implementation ExampleClass @synthesize name; @end 

Теперь компилятор будет синтезировать методы доступа для имени.

 ExampleClass *newObject=[[ExampleClass alloc]init]; NSString *name1=[newObject name]; // get 'name' [obj setName:@"Tiger"]; 

Список атрибутов @property: атомное. неатомический. saxlamaq. копия. неизменяемые. читай пиши. назначить. сильный.

atomic: это поведение по умолчанию. Əgər bir obyekt atom kimi elan edilərsə, bu mövzuya təhlükəsiz olur. Bu cədvəlin xüsusi bir nümunəsinin yalnız bir axını bu obyekt üzərində nəzarət edə bilər, axın alətləri.

Məsələn:

 @property NSString *name; //by default atomic @property (atomic)NSString *name; // explicitly declared atomic 

nonatomic: он не является потокобезопасным. Sintez olunan istifadəçilər eyni dəyərin müxtəlif axınlardan eyni vaxtda mövcud olmasına nə ilə bağlı heç bir zəmanət vermədən, sadə birləşdiricinin sadəcə dəyərini təyin etdiyini və ya qaytarmasını göstərmək üçün nonatomic əmlak xüsusiyyətindən istifadə edə bilərsiniz. По этой причине он быстрее получает доступ к неатомическому свойству, чем к атомному. @property (nonatomic)NSString *name;

Сохранить: требуется, когда атрибут является указателем на объект. Метод setter увеличит количество удержаний объекта, чтобы он занимал память в пуле автозапуска. @property (retain)NSString *name;

copy: если вы используете копию, вы не можете использовать сохранение. Bir sinifin surətinin nümunəsini istifadə edərək, öz surətini ehtiva edir. Modifikasiya edilmiş simli müəyyən edilmiş və sonradan dəyişdirilmiş olsa belə, nümunə quraşdırılma zamanı olan hər hansı bir dəyəri tutur. No setter və getter metodları sintez olunmayacaq.

 @property (copy) NSString *name; NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"]; xyzObj.name = nameString; [nameString appendString:@"Pizza"]; 

readonly: Если вы не хотите, чтобы свойство было изменено с помощью метода setter, вы можете объявить свойство readonly. @property (readonly) NSString *name;

readwrite: это поведение по умолчанию. Readwrite xüsusiyyətini açıq şəkildə göstərməyinizə ehtiyac yoxdur.

@property (readwrite) NSString *name;

assign: сгенерирует сеттер, который напрямую присваивает значение переменной экземпляра, а не копирует или сохраняет его. Это лучше всего подходит для таких примитивных типов, как NSInteger и CGFloat, или объектов, которые вы не являетесь непосредственно, например делегатов.

@property (assign) NSInteger year;

strong: это замена для сохранения. @property (nonatomic, strong) AVPlayer *player;

unsafe_unretained: Есть несколько классов в Cocoa и Cocoa Touch, которые еще не поддерживают слабые ссылки, а это означает, что вы не можете объявить слабое свойство или слабую локальную переменную, чтобы отслеживать их. Эти классы включают NSTextView, NSFont и NSColorSpace и т.д. Bu siniflərdən birinə zəif istinad istifadə etməlisinizsa, təhlükəli bir keçiddən istifadə etməlisiniz. Небезопасная ссылка похожа на слабую ссылку на то, что она не поддерживает связанный с ней объект, но он не будет установлен в нуль, если объект назначения будет освобожден.

@property (unsafe_unretained) NSObject *unsafeProperty;

8
ответ дан Varun Naharia 18 июня '15 в 8:25 2015-06-18 08:25

Прежде чем начать: вы должны знать, что каждый объект в памяти должен быть освобожден из памяти для новой записи. Вы не можете просто писать поверх чего-то, как на бумаге. Вы должны сначала стереть (dealloc), а затем вы можете записать на него. Если в тот момент, когда стирание выполнено (или сделано наполовину) и ничего еще не написано (или написано наполовину), и вы пытаетесь его прочитать, это может быть очень проблематично! Атомная и неатомическая помощь по-разному обрабатывает эту проблему.

Сначала прочитайте этот вопрос, а затем прочитайте ответ Bbum . Кроме того, прочитайте мое резюме.


atomic ВСЕГДА будет гарантировать

  • Если два разных человека хотят читать и писать одновременно, ваша бумага не будет просто гореть! → Ваше приложение никогда не будет терпеть крах даже в условиях гонки.
  • Если один человек пытается писать и написал только 4 из 8 писем, то не может читать в середине, чтение может быть сделано только при написании всех 8 букв → Нет читать (получить) произойдет в "потоке, который все еще записывается", т.е. если будет записано 8 байт в байтах, и только 4 байта записаны - до этого момента вам не разрешено читать с него. Но так как я сказал, что он не будет разбит, тогда он будет читать из значения автореализованного объекта.
  • Если до пишет , удалил то, что было написано ранее на бумаге, а затем кто-то хочет прочитать, вы все равно можете прочитать. Nasıl? Вы будете читать из чего-то похожего на мусорную корзину Mac OS (так как мусорная корзина не стирается на 100%... это в подвешенном состоянии) --- > Если ThreadA должен читать, пока ThreadB уже освобожден от записи, вы могли бы либо получить значение из окончательного полностью записанного значения ThreadB или получить что-то из пула автозапуска.

Сохранение счетчиков - это способ управления памятью в Objective-C. Когда вы создаете объект, он имеет счет сохранения 1. Когда вы отправляете объект сохраняет сообщение, его счетчик удержания увеличивается на 1. Когда вы отправляете объекту сообщение о выпуске, его количество удержания уменьшается 1. Когда вы отправляете объект сообщение автореферата , его счетчик сохранения уменьшается на 1 на определенном этапе в будущем. Если объект сохраняется count уменьшается до 0, оно освобождается.

  • Atomic не гарантирует безопасность потока, хотя он полезен для обеспечения безопасности потоков. Безопасность потоков по сравнению с тем, как вы пишете свой код/​​какую очередь потоков вы читаете/пишете. Он гарантирует только многопоточность с многократной записью.

Подождите, что?! Многопоточность и безопасность потоков отличаются?

Bəli Многопоточность означает: несколько потоков могут одновременно считывать общую часть данных, и мы не будем аварийно завершать работу, но это не гарантирует, что вы не читаете значение, не поддерживаемое автореализацией. Благодаря безопасности потока гарантируется, что то, что вы читаете, не будет автоматически выпущено. Причина, по которой мы не делаем все атомарным по умолчанию, - это потому, что есть стоимость исполнения, и для большинства вещей на самом деле не нужна безопасность потоков. Для этого нужны несколько частей нашего кода, и для этих нескольких частей нам нужно написать наш код в потоковом режиме с помощью блокировок, мьютексов или синхронизации.


nonatomic

  • Поскольку нет такой вещи, как Mac OS Trash Bin, тогда никто не заботится о том, всегда ли вы получаете значение (< - Это может потенциально привести к сбою), и никто не заботится, если кто-то попытается прочитать на полпути вы пишете (хотя наполовину запись в памяти сильно отличается от наполовину написания на бумаге, по памяти это может дать вам сумасшедшую глупое значение раньше, а на бумаге вы видите только половину того, что было написано) → Не гарантирует не сбой, потому что он не использует механизм автоответа.
  • Не гарантирует, что все записанные значения будут прочитаны!
  • Быстрее, чем атомный

В целом они различаются по двум аспектам:

  • Сбой или нет из-за наличия или отсутствия пула авторасчетов.

  • Позволяет читать прямо посередине "еще не законченного записи или пустого значения" или не разрешать и разрешать чтение только после полной записи значения.

7
ответ дан Honey 28 апр. '16 в 19:18 2016-04-28 19:18

Атомное свойство гарантирует сохранение полностью инициализированного значения независимо от того, сколько потоков работает на нем.

Неатомическое свойство указывает, что синтезированные аксессоры просто устанавливают или возвращают значение напрямую, без каких-либо гарантий относительно того, что произойдет, если одно и то же значение будет доступно одновременно из разных потоков.

4
ответ дан Laxman Sahni 23 окт. '15 в 18:41 2015-10-23 18:41

Atomic означает, что только один поток может получить доступ к переменной за раз (статический тип). Atomic является потокобезопасным, но он медленный.

Nonatomic означает, что несколько потоков могут одновременно обращаться к переменной (динамический тип). Nonatomic - небезопасный поток, но он быстро.

3
ответ дан Kemo 01 февр. '16 в 11:27 2016-02-01 11:27

Если вы используете атомный, это означает, что поток будет безопасным и доступным только для чтения. Если вы используете неатомический, это означает, что несколько потоков обращаются к переменной и являются небезопасными, но выполняются быстро, выполняются операции чтения и записи; это динамический тип.

2
ответ дан Preetha 13 февр. '16 в 16:34 2016-02-13 16:34

Atomic

- поведение по умолчанию будет гарантировать, что текущий процесс будет завершен ЦП, прежде чем другой процесс обратится к переменной не быстро, так как он полностью завершает процесс

неатомарная

НЕ является поведением по умолчанию быстрее (для синтезированного кода, то есть для переменных, созданных с использованием @property и @synthesize) небезопасный может привести к неожиданному поведению, когда два разных процесса доступа к одной и той же переменной в то же время

0
ответ дан karthik 02 дек. '17 в 23:00 2017-12-02 23:00

Атомарные свойства : - Когда переменная, назначенная с атомарным свойством, которое означает, что она имеет доступ только к одному потоку и будет поточно-ориентированной и будет хорошей с точки зрения производительности, будет иметь поведение по умолчанию.

Неатомарные свойства : - Когда переменная, назначенная с атомарным свойством, которое означает, что она имеет многопоточный доступ и не будет потокобезопасной, будет медленной с точки зрения производительности, будет иметь поведение по умолчанию и когда два разных потока захотят получить доступ к переменной одновременно это даст неожиданные результаты.

0
ответ дан ashish.surana 04 авг. '18 в 14:26 2018-08-04 14:26

Истина заключается в том, что они используют блокировку спина для реализации атомного свойства. Код, как показано ниже:

  static inline void reallySetProperty(id self, SEL _cmd, id newValue, ptrdiff_t offset, bool atomic, bool copy, bool mutableCopy) { id oldValue; id *slot = (id*) ((char*)self + offset); if (copy) { newValue = [newValue copyWithZone:NULL]; } else if (mutableCopy) { newValue = [newValue mutableCopyWithZone:NULL]; } else { if (*slot == newValue) return; newValue = objc_retain(newValue); } if (!atomic) { oldValue = *slot; *slot = newValue; } else { spin_lock_t *slotlock =  _spin_lock(slotlock); oldValue = *slot; *slot = newValue; _spin_unlock(slotlock); } objc_release(oldValue); } 
0
ответ дан paul 09 дек. '16 в 7:58 2016-12-09 07:58

Чтобы упростить всю путаницу, давайте разберемся с блокировкой мьютекса.

Блокировка мьютекса в соответствии с именем блокирует изменчивость объекта. Таким образом, если к объекту обращается класс, никакой другой класс не может получить доступ к тому же объекту.

В iOS @sychronise также обеспечивает блокировку мьютекса. Теперь он работает в режиме FIFO и гарантирует, что на поток не влияют два класса, совместно использующие один и тот же экземпляр. Однако, если задача находится в главном потоке, избегайте доступа к объекту с использованием атомарных свойств, так как это может задержать ваш пользовательский интерфейс и снизить производительность.

0
ответ дан Suryanarayan Sahu 23 сент. '16 в 21:41 2016-09-23 21:41

Atomic: Обеспечьте безопасность потока, заблокировав поток с помощью NSLOCK.

Non atomic: не обеспечивает безопасность потока, поскольку механизм фиксации нити отсутствует.

0
ответ дан satisharyan 29 июня '16 в 11:56 2016-06-29 11:56

Atomic (по умолчанию) Atomic по умолчанию: если вы ничего не набираете, ваше свойство является атомарным. Атомное свойство гарантируется, что если вы попытаетесь прочитать его, вы вернете действительное значение. Он не дает никаких гарантий относительно того, что это может быть, но вы получите хорошие данные, а не только нежелательную память. Это позволяет вам сделать это, если у вас есть несколько потоков или несколько процессов, указывающих на одну переменную, один поток может читать, а другой поток может писать. Если они попадают одновременно, читательский поток гарантированно получит одно из двух значений: либо до изменения, либо после изменения. Что атомный не дает вам, это какая-то гарантия того, какие из этих значений вы можете получить. Atomic действительно часто путают с потокобезопасностью, и это неверно. Вам необходимо гарантировать, что ваши потоки безопасны другими способами. Однако атомный будет гарантировать, что если вы попытаетесь прочитать, вы получите какую-то ценность.

неатомической С другой стороны, неатомные, как вы можете догадаться, просто означают: "Не делайте этого атомного материала". То, что вы теряете, - это гарантия того, что вы всегда что-то возвращаете. Если вы попытаетесь прочитать в середине записи, вы можете вернуть данные мусора. Но, с другой стороны, вы идете немного быстрее. Поскольку свойства атома должны делать какую-то магию, чтобы гарантировать, что вы вернете значение, они немного медленнее. Если это свойство, к которому вы обращаетесь много, вам может потребоваться спуститься до неатомического, чтобы убедиться, что вы не выполняете это ограничение скорости.

0
ответ дан Ebin Joy 02 дек. '17 в 23:01 2017-12-02 23:01

Атомарность атомная (по умолчанию)

По умолчанию используется Atomic: если вы ничего не вводите, ваше свойство является атомарным. Атомарное свойство гарантировано, что если вы попытаетесь прочитать из него, вы получите верное значение. Это не дает никаких гарантий относительно того, каким может быть это значение, но вы получите хорошие данные, а не только ненужную память. Это позволяет вам делать, если у вас есть несколько потоков или несколько процессов, указывающих на одну переменную, один поток может читать, а другой поток может писать. Если они попадают в одно и то же время, поток чтения гарантированно получит одно из двух значений: либо до изменения, либо после изменения. То, что не дает вам атомарность, это какая-то гарантия того, какие из этих ценностей вы можете получить. Atomic обычно путают с поточностью потоков, и это не правильно. Вы должны гарантировать безопасность вашей нити другими способами. Тем не менее, Atomic гарантирует, что если вы попытаетесь читать, вы получите какое-то значение.

неатомической

С другой стороны, неатомарное, как вы, вероятно, можете догадаться, просто означает "не делайте этого атомарного материала". То, что вы теряете, - это гарантия того, что вы всегда что-то получите. Если вы попытаетесь прочитать в середине записи, вы можете получить обратно данные мусора. Но, с другой стороны, вы идете немного быстрее. Поскольку атомарные свойства должны творить чудеса, чтобы гарантировать возвращение значения, они немного медленнее. Если это свойство, к которому вы часто обращаетесь, вы можете перейти к неатомному, чтобы убедиться, что вы не понесете этот штраф за скорость. Доступ

Вежливость https://academy.realm.io/posts/tmi-objective-c-property-attributes/

Атрибуты свойств атомарности (атомарные и неатомарные) не отражены в соответствующем объявлении свойства Swift, но гарантии атомарности реализации Objective-C все еще сохраняются, когда к импортированному свойству обращаются из Swift.

Итак, если вы определите атомарное свойство в Objective-C, оно останется атомарным при использовании Swift.

вежливость https://medium.com/@YogevSitton/atomic-vs-non-atomic-properties-crash-course-d11c23f4366c

0
ответ дан Suraj K Thomas 29 янв. '19 в 9:12 2019-01-29 09:12

Другие вопросы по меткам или Задайте вопрос