Hva du trenger å vite om automatisk eiendomssyntese

I de siste utgivelsene av XCode har Apple gjort noen interessante forbedringer på hvordan LLVM-kompilatoren håndterer deklarerte egenskaper. Disse forbedringene har resultert i synlige endringer i hvordan egenskapene nå vises i prosjektmaler, kode automatisk generert av IDE og i Apples prøvekode, hvorav noen nå tester din forståelse av hvilke egenskaper og hvordan de faktisk fungerer. Så før du bare blankt hopper inn og bruker automatisk syntetiserte egenskaper, er det verdt å ta et øyeblikk for å forstå nøyaktig hva som foregår under dekslene.

Egenskaper vs. forekomstvariabler

Først og fremst er egenskaper ikke de samme som forekomstvariabler ( ivars) . Forekomstvariabler inneholder informasjon om de forskjellige attributtene til et objekt, for eksempel en spillers navn eller poengsum i en spillapp. Egenskaper blir ofte støttet av ivars, selv om de ikke trenger å være det.

Når du erklærer en eiendom, erklærer du i utgangspunktet tilgangsmetoder, som brukes til å angi og hente (få) eiendommens verdi. Oftest bruker du @synthesize-setningen for å fortelle kompilatoren om automatisk å generere disse metodene, men du kan også skrive dem selv når veldig spesifikk oppførsel er ønsket. Det er derfor veldig viktig å holde forskjellen mellom egenskaper og ivars klar i tankene dine.

For å illustrere, viser mange begynnende iOS-bøker og opplæringsprogrammer noe som dette i overskriftsfilen (.h):

Dette blir fulgt av denne koden i implementeringsfilen (.m):

Det som ikke umiddelbart er åpenbart for den nye IOS-programmereren, er at playerName både er navnet på en ivar i grensesnittdefinisjonen og navnet på eiendommen som er erklært i @property-uttalelsen, men de er ikke det samme . Fordi både navnene og typene tilfeldigvis stemmer, vil kompilatoren automatisk tildele ivaren å sikkerhetskopiere egenskapen når den syntetiserer accessor-metodene, som ligner på dette (i dager før ARC):

Vi kan til og med bruke XCode for å observere forskjellen. Hvis vi ser på @synthesize-setningen, viser XCode at playerName er en egenskap:

Men i setter-metoden ser vi at det er en ivar:

Generelt sett, med mindre du har veldig spesifikk grunn til ikke å gjøre det, bør ivars få tilgang til ved hjelp av deres eiendomsmetoder i stedet for direkte slik at spesiell logikk, for eksempel grensekontroll, etc. blir utført. En setter-egenskap kan utføre annen tilpasset logikk i tillegg til bare å endre verdien på ivar. Men hvis både ivaren og eiendommen har samme navn, hvordan bestemmer du hvilken du refererer til?

Det er her selvnøkkelordet spiller inn. Ved å prefiksere spillernavn med selv. du får tilgang til eiendommen; uten den vil du direkte referere til ivaren.

Dette kan ikke virke viktig, men antar at du har en getter-metode som gjør spesiell behandling som denne:

Spillerens ferdighetsnivå bestemmer en rekke fiender som skal bekjempes. La oss se hva som skjer når vi kjører følgende kode:

Vi får følgende resultater:

Den første NSLog-uttalelsen refererer til fiendenArray ivar direkte. Nye iOS-programmerere kan forvente at dette vil returnere en verdi på 2, men på dette tidspunktet er ikke אויבArray blitt initialisert og er null, så å sende tellemeldingen til den resulterer i en 0, og vi har tilsynelatende ingen fiender å kjempe.

Fordi den andre NSLog-uttalelsen refererer til eggen.enemyArray- egenskapen, kalles accessor-metoden for å øyeblikkelig verdien av fiendenArray ivar. Når vi nå refererer til ivaren direkte i den tredje NSLog-uttalelsen, får vi verdien vi ventet.

Take-away er at hvis du ikke er nøye med å få tilgang til ivars gjennom deres egenskaper, kan du få uventede resultater og introdusere subtile feil som kan være vanskelige å spore opp senere.

En bedre måte

En av de siste forbedringene i XCode er fokuset på bruken av understrekningskarakteren som en konvensjon for å navngi forekomstvariabler. Målet er å fremme kodelesbarhet og samtidig bidra til å unngå feilen ved å komme til en forekomstvariabel i stedet for eiendommen. Teknisk sett var dette mulig før Apple offisielt byttet i dokumentasjonen, men med XCode 4.4 har det blitt den foretrukne måten, og er mye mer synlig til stede. Ved å bruke denne konvensjonen ser toppkoden nå ut slik:

Og implementeringskoden vår ser slik ut:

Å bruke understrekingen nå gjør det ganske tydelig når det refereres til forekomstvariabelen. Når vi har så mye nå under beltene, kan vi nå sette pris på og forstå den automatiske syntesen av egenskaper.

Med automatisk syntese er det ikke lenger nødvendig å spesifikt erklære støtte ivars eller skrive @synthesize-setningen. Når kompilatoren finner en @property-uttalelse, vil den gjøre begge deler på våre vegne ved å bruke retningslinjene vi nettopp har gjennomgått. Så alt vi trenger å gjøre er å erklære en eiendom som denne:

Og kompilatoren vil automatisk erklære en ivar som heter _playerName, og utføre en @synthesize-setning for å binde dem slik:

Verken erklæringen om ivar eller synteseerklæringen vil vises i koden din. det legges ganske enkelt inn på kompileringstidspunktet.

endelige utfallet

Det er alt for å forstå automatisk syntese. Selv om det kanskje ikke virker som mye av det store, er resultatet at mye av den verdslige kodingen vi pleide å gjøre når vi satt opp ivars og egenskaper, nå kan elimineres fullstendig. Vi kan erklære eiendommer i en enkel uttalelse og gå videre! Og siden du nå forstår hva som skjer bak kulissene, kan du gjøre det med selvtillit.

Les også:

  • Fem bøker som hver Apple iOS-utvikler skal eie
  • Lag din egen Apple iPhone Clock-app
  • Apple lar apputviklere gjenoppta sporing med iOS 6

© Copyright 2021 | pepebotifarra.com