Indiferent dacă încercați să vă dați seama de ce matricea dvs. are 3 obiecte în loc de 5 sau de ce jocul dvs. se joacă înapoi de la începerea noului tip, depanarea este o parte esențială a procesului de dezvoltare. La sfarsitul acestui articol, veti avea o intelegere a celor mai importante facilitati de depanare pe care le aveti la dispozitie si cum sa le folositi pentru a va ajuta sa va incercati bug-urile in mai putin timp.
Vom studia cum să:
Această mică căsuță neagră din partea de jos a Xcode ar trebui să fie cea mai bună prietenă atunci când vine vorba de depanare. Emite mesaje de jurnal, mesaje de eroare și tot felul de alte lucruri utile care vă vor ajuta să urmăriți erorile. În plus față de citirea rezultatelor direct din jurnal, putem, de asemenea, să ne oprim la un moment dat în programul nostru și să inspectăm diferite părți ale aplicației noastre.
Voi presupune că știți cum funcționează punctele de blocare (și dacă nu, nu vă faceți griji, o veți lua până la sfârșitul acestui!). Punctele de blocare sunt neprețuite pentru a vedea unde este aplicația noastră la un moment dat, dar poate fi o durere pentru a trece printr-o buclă sau o funcție recursivă după declanșarea unui punct de întrerupere până când obiectul nostru este egal cu o anumită valoare. Introduceți puncte de întrerupere condiționate!
Condiționate punctele de întrerupere sunt puncte de întrerupere care se vor rupe doar atunci când o anumită condiție este îndeplinită. Imaginați-vă că dorim doar să rupem atunci când un obiect se află într-o anumită stare sau pe a noua iterație a unei buclă. Adăugați un punct de întrerupere a codului dvs. făcând clic pe "jgheab" al editorului Xcode, faceți clic dreapta pe punctul de întrerupere și apoi selectați "editați punctul de întrerupere" pentru a stabili condițiile speciale.
Puteți furniza o condiție (de exemplu, i == 12) sau de câte ori ar trebui ignorat punctul de întrerupere. De asemenea, puteți adăuga acțiuni care apar automat la pauză, de exemplu o comandă de depanare care imprimă o valoare.
Bacsis: Comanda rapidă de la tastatură pentru adăugarea / eliminarea unui punct de întrerupere este comandă + \Un alt truc important de întrerupere a punerii în aplicare este adăugarea punctului de excepție. Ați observat vreodată că 99% din momentul în care am lovit o excepție, Xcode ne duce la piscina autorelease în principala noastră metodă?
Prin setarea unui punct de oprire a excepției, puteți trece linia exactă a codului care a cauzat excepția cu un punct de întrerupere. Pentru a face acest lucru, deschideți tab-ul cu excepția breakpoint (comanda + 6). În stânga jos a ferestrei există un buton "+". Selectați această opțiune pentru a adăuga un "break breakpoint". Acum, când Xcode întâlnește o excepție, se va rupe locul unde a apărut codul.
Dacă am rupt într-un anumit punct al aplicației noastre, în general, aceasta este pentru că vrem să vedem în ce stare sunt obiectele în care ne aflăm. Xcode ne oferă "vizualizarea variabilelor" care este acea vizualizare din partea de jos a Xcode de lângă consola. Teoretic afișează starea actuală a tuturor valorilor relevante în contextul actual. În practică, uneori acest lucru se dovedește a fi un mic buggy. Uneori nu va afișa valori sau nu le va actualiza când treceți.
Din fericire, putem inspecta obiecte specifice folosind niște comenzi de consolă foarte utile. Tastarea "po" în consola ne permite să obținem detalii detaliate despre un anumit obiect (atunci când ne ocupăm de valorile scalare pe care le folosim "p").
Acest lucru poate fi util pentru a vedea dacă un obiect există deja (aceasta va fi imprimată zero dacă nu), determinarea valorii unui obiect, aflarea a ceea ce conține un matrice / dicționar la timpul de execuție și chiar compararea a două obiecte. Deoarece această comandă imprimă adresa de memorie a obiectului relevant, puteți imprima două obiecte pe care le considerați aceleași și pentru a vedea dacă au aceeași adresă de memorie pentru a fi siguri.
O altă comandă utilă dar ascunsă pe care o puteți utiliza pentru a vă inspecta cu ușurință opiniile dvs. este recursiveDescription comanda. Apelați acest lucru într-o vizualizare pentru a obține o imprimare din ierarhia sa de vizualizare.
Există anumite momente când depanem programul nostru și dorim să conectăm un anumit mesaj la consola. Funcția "NSLog" ne permite să tipărim orice ieșire dorită în consola. Acest lucru poate fi important dacă vrem să urmăm anumite căi prin aplicarea noastră sau să testați ce valoare este egală fără a fi nevoie să plasați în mod explicit punctele de pauză la fiecare linie posibilă. NSLog urmează același format ca [NSString StringWithFormat] (după cum puteți vedea în scurtătura de mai jos).
Bacsis: Nouă pentru formatarea șirurilor în Obiectiv-C? Consultați Ghidul de programare a șirurilor de mereÎn timp ce NSLog este util, trebuie să fim inteligenți cu privire la modul în care îl implementăm. Orice lucru care este imprimat din NSLog intră în codul de producție și, prin urmare, este vizibil pentru oricine. Dacă cineva ar trebui să conecteze dispozitivul la organizator și să privească la consola, s-ar putea să vadă fiecare mesaj jurnal. După cum vă puteți imagina, asta ar putea avea unele implicații grave! Imaginați-vă dacă ați tipărit o logică secretă a algoritmului sau o parolă a utilizatorului la consola! Din acest motiv, aplicațiile vor fi uneori respinse dacă Apple detectează prea multă producție în consolă într-o producție de producție.
Din fericire, există o modalitate mai bună de a face logarea. În funcție de efortul pe care doriți să-l puneți, există mai multe modalități de a face acest lucru. Poate că cel mai simplu mod este să utilizați o macrocomandă care include numai NSLog în construirea de depanare. Includerea acestui lucru într-un fișier antet accesibil global înseamnă că puteți introduce cât mai multe jurnale în codul dvs. sau nici una din ele nu va intra în producție (cu condiția să nu modificați valorile prestabilite ale macro-urilor pre-procesoare și dacă nu știți ce sunt acestea, nu vă faceți griji).
#fdef DEBUG #define DMLog (...) NSLog (@ "% s% @", __PRETTY_FUNCTION__, [NSString stringWithFormat: __ VA_ARGS__]
Acum, dacă utilizați DMLog (sau orice altceva ați alege să-l apelați), va fi imprimat numai în timpul unei depanări. Orice producție de producție nu va face nimic. __PRETTY_FUNCTION__ ajută de asemenea prin tipărirea numelui funcției căreia vine logarea.
În timp ce NSLog este mare, are o serie de limite:
Pentru cei care doresc să obțină hardcore despre logare, există cadre acolo care depășesc unele sau toate aceste limite în funcție de efortul pe care doriți să-l puneți înăuntru. Aș recomanda să vă uitați la următoarele instrumente:
Deși introducerea Numerotării automate de referință (ARC) a asigurat că gestionarea memoriei nu este vampirul masiv de timp pe care l-am folosit, este important să urmăriți evenimente importante în ciclurile de viață ale obiectului nostru. La urma urmei, ARC nu elimină posibilitatea scurgerilor de memorie sau încercarea de a accesa un obiect eliberat (pur și simplu face acest lucru mai greu de făcut). În acest scop, putem implementa o serie de procese și instrumente care să ne ajute să fim atenți la ceea ce fac obiectele noastre.
Cele două metode cele mai importante într-un ciclu de viață al obiectului Obiect-C sunt: init și dealloc metode. Este o idee minunată să înregistrați aceste evenimente în consola dvs., astfel încât să puteți urmări când obiectele voastre revin la viață și, mai important, asigurați-vă că vor dispărea atunci când se presupune că acestea.
- (id) init auto = [super init]; dacă (auto) NSLog (@ "% @:% @", NSStringFromSelector (_cmd), auto); întoarce-te; - (void) dealloc NSLog (@ "% @:% @", NSStringFromSelector (_cmd), de sine);
În timp ce tastați acest cod ar putea părea nerăbdător să începeți, există modalități de a automatiza procesul și de a face acest lucru mai ușor. Pot garanta că va veni la îndemână atunci când cererea dvs. se comportă în moduri în care nu ar trebui. Puteți utiliza, de asemenea, câteva trucuri pe care le-ați învățat în secțiunea de jurnalizare, astfel încât aceasta să nu fie imprimată într-o construcție de producție (sau chiar mai bună, creați o macrocomandă pentru ea!).
Există două instrumente care vin cu Xcode pe care le putem folosi pentru a ne curăța codul și pentru a face codul nostru mai puțin predispus la erori. Instrumentul Static Analyzer este un mod minunat pentru Xcode de a recomanda îmbunătățiri ale codului nostru, de la obiecte neutilizate până la obiecte care pot fi sub sau peste obiecte eliberate (încă o problemă la ARC pentru obiectele Core Foundation). Pentru a vedea aceste recomandări, mergeți la Produs și selectați "Anlayze".
Inspectorul este un instrument puternic care ne permite să "inspectăm" îndeaproape diferitele aspecte ale aplicației noastre în legătură cu utilizarea memoriei, activitatea pe sistemul de fișiere și oferă chiar și modalități de automatizare a interacțiunii UI. Pentru a "inspecta" aplicația selectați "Profil" din meniul derulant "Produs".
Aceasta va deschide fereastra Instrumente, unde puteți selecta un șablon de profil pentru a rula. Cele mai obișnuite dintre ele sunt zombi (vom discuta mai târziu), monitorizarea activității și scurgerile. Scurgerile sunt probabil șablonul cel mai util pentru a alerga pentru a descoperi orice scurgeri de memorie care ar putea fi prezente în aplicația dvs..
Deși este mult mai greu să fugi în eroarea EXC_BAD_ACCESS de acum încolo, că ARC este instalată, aceasta se poate întâmpla în anumite circumstanțe. În cazul în care se ocupă cu UIPopoverController sau cu obiecte de fundație, putem încerca în continuare să accesăm un obiect lansat peste tot. În mod normal, când eliberăm un obiect în memorie, acesta este plecat pentru totdeauna. Cu toate acestea, când sunt activate Zombies, obiectul este marcat doar ca eliberat, dar rămâne în memorie. În acest fel, când accesăm un obiect Zombie, Xcode ne poate anunța că ați încercat să accesați un obiect care în mod normal nu ar fi acolo. Pentru că încă mai știe ce este, vă poate spune unde și când sa întâmplat.
Poți să vânezi Zombii folosind două metode. Fie prin utilizarea inspectorului și executarea unui șablon de profil Zombie, fie prin activarea acestuia ca opțiune de diagnostic în cadrul opțiunii "Executare". În dreptul butonului de oprire, faceți clic pe numele schemei, apoi faceți clic pe "Editați schema", iar sub rubrică faceți clic pe fila de diagnosticare și selectați "Activați obiectele zombie". Rețineți că depanarea în modul Zombie este disponibilă numai când depanați în simulator, nu o puteți face pe un dispozitiv real.
Sperăm că cele de mai sus v-au oferit câteva informații despre cum să depanați cererile mai eficient. Este vorba despre găsirea unor modalități de reducere a timpului de reparare a bug-urilor, astfel încât să putem petrece mai mult timp făcând ceea ce este important, construind aplicații grozave!
Aceasta nu este o listă completă. Există multe alte tehnici care nu au fost discutate aici, cum ar fi problemele legate de depanare în producție, raportarea la distanță a erorilor, raportarea la accidente și multe altele. Aveți o tehnică pe care doriți să o împărtășiți? Poate că ai o întrebare legată de unul dintre punctele de mai sus? Postați-l mai jos în comentarii!
Programare fericită!