Aflați obiectivul-C Ziua 3

Bine ați venit în partea a treia a acestei serii - sper că vă bucurați de ea! Săptămâna trecută ne-am uitat la modul în care separăm clasele în fișiere separate (interfață și implementare), în această săptămână vom examina din nou clasele, dar puțin mai profund. De asemenea, vom avea un maxim în moștenire și cum funcționează, împreună cu domeniul variabil.

Până în prezent, am avut niște feedback minunat prin e-mail, twitter și comentarii. Este minunat să vedem că atât de mulți oameni sunt interesați de acest subiect și este chiar mai bine să vedem că atât de mulți dintre voi îl încercați pentru dvs. și puneți câteva mari întrebări. Ține-o așa!

În revizuire: Clase și obiecte

Să examinăm ceea ce am învățat despre clasele din această serie până acum. Dacă nu cunoașteți niciunul din aceste lucruri, nu ezitați să reveniți la ultimul tutorial pentru a vă repara. Ok, deci, ce sunt clasele?

O clasă este o colecție de date incapsulate și metode personalizate. O clasă poate conține multe tipuri diferite de date, iar metodele de clasă efectuează de obicei (dar nu întotdeauna) acțiuni legate de aceste date. În Obiectiv-C, o clasă este de obicei compusă din două fișiere: un fișier de interfață și un fișier de implementare. Fișierul de interfață folosește extensia de fișiere .h după convenție și este locul în care persoana care utilizează clasa poate găsi rapid metode și date disponibile pentru clasă. Fișierul de implementare folosește extensia de fișiere .m după convenție și este locul în care se află majoritatea codului, deoarece conține implementarea reală a tuturor funcțiilor declarate în interfață.

Deci, ceea ce face o clasă diferită de un obiect? Ce este un obiect? Un obiect este o instanță a unei clase. Gândiți-vă la exemplul nostru cu mașina în ultima parte a seriei. Unde mașină este clasa, atunci mașina mea, dansCar, și yourCar ar fi toate obiectele deoarece sunt exemple ale clasei de mașini.

Clase de la Apple (și unele istorie)

Înainte de a continua, aș vrea să împărtășesc câteva (din multe) clase comune pe care le veți folosi o mulțime care sunt furnizate de Apple, dar mai întâi o lecție de istorie rapidă.

Multe clase oferite de Apple sunt prefixate de abrevierea "NS", care reprezintă NextStep. Când Steve Jobs a părăsit Apple, a fondat compania NeXT, creând computere care funcționau pe baza sistemului său de operare. Limbajul de programare orientat obiect utilizat pe aceste mașini a fost numit NeXTSTEP, de unde ajungem de la "NS". Când Apple a "achiziționat" (o altă lecție de istorie în sine) NeXTSTEP, au decis să se bazeze pe Mac OS X pe NeXTSTEP.

Iată câteva clase simple, comune: vom vedea o mulțime de:

  • NSString este un șir de text care este imuabil.
  • NSMutableString este un șir de text care poate fi mutat.
  • NSArray este o serie de obiecte care sunt imuabile.
  • NSMutableArray este o serie de obiecte care sunt mutabile.
  • NSNumber are o valoare numerică.

Vom învăța mai multe mai târziu, dar pentru moment, cele de mai sus vor veni la îndemână. Probabil vă întrebați ce înseamnă mijloace imateriale și imuabile, care este o întrebare cu totul rezonabilă. Dacă este un obiect imuabil adică atunci când creăm obiectul și atribuim o valoare atunci este statică. Valoarea nu poate fi modificată. Dacă este un obiect mutabil atunci este dinamic, adică valoarea poate fi schimbată după creare.

Indicatori și inițializare

Să presupunem că vrem să facem un șir de text static și să îl logăm, cum să facem asta? În codul nostru ar arăta ceva de genul:

 #import  int principiu (int argc, const char * argv []) NSString * testString; testString = [[NSString alinia] init]; testString = @ "Iată un șir de test în testString!"; NSLog (@ "testString:% @", testString); retur 0;  

Am creat acest fișier în XCode, mergând la Fișier> Proiect nou> Mac OS X> Aplicație> Instrument linie de comandă> Tip: Fundație (destul de o călătorie!) și editarea fișierului de implementare (extensie: .m) în proiect.

Sunt multe lucruri care sunt noi, așa că să examinăm piesa de mai sus cu bucăți.

Mai întâi de toate, importăm biblioteca de fundație (acest lucru se datorează faptului că am setat tipul la Fundație în noua fereastră de proiect înainte).

 int principiu (int argc, const char * argv [])  

Aceasta declanșează funcția inițială care va fi apelată când începe programul nostru. Cei doi parametri separați printr-o virgulă sunt pentru trecerea argumentelor la aplicația noastră. Deocamdată, nu vă faceți griji cu privire la acestea, deoarece nu le vom avea nevoie chiar acum.

 NSString * testString; testString = [[NSString alinia] init]; 

Acum creăm un pointer către un obiect NSString numit testString. Odată ce prima linie a acestui lucru este terminată, nu există încă un șir, doar un indicator pentru un șir pe care nu l-am creat încă. În linia următoare, vom crea șirul la care indică indicatorul.

Am putea să scriem alternativ ultima linie ca aceasta;

 testString = [NSString alocare]; [teststring init]; 

Acest lucru poate părea puțin la început confuz. În prima versiune, am plasat declarațiile în paranteze pe aceeași linie, în timp ce în al doilea rând am separat instrucțiunile în două rânduri. Metoda inițializează toate variabilele de instanță din clasă.

 testString = @ "Iată un șir de test în testString!"; 

Această linie este destul de explicativă, motivul pentru care prefixăm citatele cu un semn @ este să-i spunem compilatorului că următorul text este un NSString.

NSLog (@ "testString:% @", testString);

Aici înregistrăm câteva informații în consola. XCode are un debugger construit în care puteți găsi sub meniul Executare. Este foarte util atunci când dezvoltați o aplicație pentru a înregistra când evenimentele se întâmplă și valorile anumitor variabile - aceasta poate ajuta atunci când depanarea problemelor aplicației și depanare. Această metodă funcționează ca și printf (amintiți-vă din prima săptămână?) Unde furnizăm un șir de text cu un caracter de înlocuire (% @ înseamnă un obiect Obiect-C).

În cele din urmă vom întoarce 0, ceea ce știm că spune sistemul de operare că cererea sa încheiat fără probleme.

Moştenire

Amintiți-vă când am făcut mai devreme NSString-ul nostru, am folosit metoda init? Ei bine, NSMutableString, NSArray și, de fapt, fiecare clasă NS, utilizează și init. Pare mult cod de risipă pentru a pune metoda init în fiecare clasă, nu? Ar fi, de aceea init este, de obicei, implementat doar o dată, în clasa rădăcină cunoscut sub numele de NSObject. Deoarece clasele moștenesc unul de celălalt, o clasă care este creată ca un copil al unei alte clase părinte va obține în mod automat acces la metodele clasei părinte.

Să luăm NSMutableString, de exemplu. NSMutableString are NSString pentru un părinte (făcându-l copil), ceea ce înseamnă că acesta moștenește din NSString. Între timp. NSString are NSObject ca părinte, așa că moșteneste de la NSObject.

De exemplu, NSObject are o metodă numită init, deci fiecare subclasă are această metodă implementată - care se numește metoda de clasă. De fapt, metoda init în NSObject nu face de fapt nimic, ci doar returnează. Motivul pentru aceasta este că metodele pot fi suprascrise. Deci, clasa NSArray poate suprascrie inițiativa pe care o moștenește pentru a adăuga funcționalitate - cum ar fi asigurarea că memoria este disponibilă sau pregătirea oricăror variabile de instanță de care ar putea avea nevoie.

După cum sa demonstrat, acest lucru este util deoarece înseamnă că, în plus față de moștenirea din clase, putem extinde clasele. Când extindem o clasă, luăm o clasă existentă și adăugăm funcționalități suplimentare celor deja disponibile. Aceasta înseamnă că ați putea să creați propria versiune de NSString cu metode suplimentare, cum ar fi o metodă de umplere a șirului cu text aleatoriu sau de a efectua un fel de codificare a caracterelor.

rezumat

În acest moment, fundamentele clasei de lucru ar trebui să fie clare. Pentru a testa înțelegerea dvs., vedeți dacă puteți răspunde la următoarele întrebări în mintea dvs .:

  • Care este diferența dintre o clasă și un obiect?
  • De ce folosim clasele??
  • De ce moștenirea este utilă?

Deoarece orele sunt o parte atât de importantă a obiectivului C, este important să te simți confortabil să lucrezi cu ei. Săptămâna trecută am început să ne uităm la cursuri, iar în această săptămână am intrat în profunzime. Săptămâna viitoare, s-ar putea să fiți bucuroși să auziți, vom pleca de la partea teoretică și vom începe să lucrăm la propria noastră clasă sau două pentru a efectua sarcini simple.

Teme pentru acasă

Din moment ce am făcut până acum teoria până acum, temele dvs. de lucru în această săptămână sunt să navigați pe site-ul web al dezvoltatorului Apple (ar fi trebuit să faceți acest lucru săptămâna trecută) și să examinați câteva dintre clasele disponibile. Dacă nu știți de unde să începeți, începeți cu ceva precum NSString. Veți deveni mai confortabil cu detaliile despre clasa parentală, metodele și așa mai departe. Acest lucru va fi important mai târziu când folosiți clase în afara acestei serii și doriți să știți ce metode le moștenesc sau le folosesc.

Data viitoare

Vom avea o săptămână mai practică săptămâna viitoare, cu unele coduri de clasă. Clasele sunt într-adevăr centrale pentru Obiectivul C, deci este important să te apropii de ei și scopul acestei serii este de a te asigura că faci!

Ca de obicei, dacă aveți întrebări sau comentarii, puteți să mă contactați prin eliminarea unui comentariu sau a unui e-mail. Dacă doriți să intrați personal în contact cu mine și să primiți un răspuns rapid, trimiteți-mi un tweet!

Cod