Atomic vs. ei-atomiominaisuuksien törmäyskurssi

Objektiiviset C-ominaisuudet voitaisiin määritellä atomisiksi tai ei-atomisiksi.

Mikä on ero näiden kahden välillä ja miten Swift-ominaisuudet käyttäytyvät? Atominen vai ei-atomi?

Atomiominaisuudet

Ominaisuuden määritteleminen atomiseksi takaa, että kelvollinen arvo palautetaan. Huomaa, että pätevä ei aina tarkoita oikein (lisätietoja tämän viestin seuraavassa osiossa).

Tämä ei myöskään tarkoita, että atomiominaisuudet ovat säiettä turvallisia. Eri säieet voivat yrittää kirjoittaa ja lukea samanaikaisesti. Yksi kahdesta arvosta palautetaan - arvo ennen muutosta tai muutoksen arvo

Atomiominaisuudet kärsivät vähäisestä suorituskyvystä lukituksen ja lukituksen avaamisen takia ennen arvon asettamista ja saamista.

Atomic on ominaisuuksien oletuskäyttäytyminen - tämä on se mitä saat, jos et määritä mitään.

Atomiominaisuudet ja säikeet Esimerkki

Oletetaan, että meillä on atomiominaisuus:

piste = CGPoint (x: 10, y: 10)

Sovelluksessamme meillä on kolme säiettä, jotka yrittävät samanaikaisesti käyttää pisteominaisuuttamme.

  • Ketju A yrittää lukea CGPoint-ominaisuuden
  • Lanka B on asetuspiste = CGPoint (x: 1, y: 1)
  • Lanka C on asetuspiste = CGPoint (x: 5, y: 5)

Iso kysymys on - mitä palataan säieeseen A?

Yksi seuraavista kolmesta arvosta:

(x = 10, y = 10)
(x = 1, y = 1)
(x = 5, y = 5)

Toinen kysymys, jonka voimme kysyä, on - mikä on pisteominaisuuden lopullinen arvo?

Yksi seuraavista kahdesta arvosta:

(x = 1, y = 1)
(x = 5, y = 5)

Ei-atomit ominaisuudet

Ei-atomiominaisuuksilla ei ole takuuta palautetusta arvosta. Se voi olla oikea arvo, osittain kirjoitettu arvo tai jopa jokin roskien arvo.
Kuten useimmat asiat, jotka eivät ole turvallisia - tämän ominaisuuksien käyttö nopeutuu.

Ei-atomiset ominaisuudet ja säikeet Esimerkki

Otetaan sama pisteominaisuus ja samat kolme säiettä, jotka tekevät täsmälleen samat asiat kuin esimerkissä atomiominaisuuksien säielanka.

Mitä palautetaan säieeseen A?

Tuntematon! Se voi olla yksi kolmesta eri arvosta edellisessä esimerkissä. Se voi olla jopa (x = 5, y = 1) kaksi säiettä yrittävät asettaa arvon samanaikaisesti. Arvo on kirjoitettu osittain, ja palautamme osittain kirjallisen arvon.

Kuinka Objective-C-runtime tekee tämän?

Katsotaanpa Object-C-ajoajan “asetetun arvon” menetelmää.

Huomaa, kuinka ei-atomiset ominaisuudet asettavat ominaisuuden arvon suoraan, kun atomiominaisuudet käyttävät lukkoja suojaamaan asetettua toimintaa.

Entä Swift?

Swift-ominaisuudet eivät ole oletuksena atomia.
Mutta - Applen käyttämän Swiftin kanssa kaakaon ja Objective-C: n kanssa (Swift 3.1):

Atomiominaisuusominaisuudet (atomit ja ei-atomit) eivät näy vastaavassa Swift-ominaisuusilmoituksessa, mutta Object-C-toteutuksen atomisuustakuut ovat edelleen voimassa, kun tuontia ominaisuuksia käsitellään Swiftistä.

Joten - jos määrität atomin ominaisuuden Objective-C: ssä, se pysyy atomisena, kun Swift käyttää sitä.