Chapter 11. Debugging and optimizing your application

published book

This chapter covers

  • Debugging applications without tools
  • Using breakpoints and stepping through your code
  • Watching variables
  • Optimizing the performance of an app

You’ve written some great-looking apps that work well, but what happens when things don’t go so smoothly? Sometimes a newly written app may behave unexpectedly or even crash. These problems are caused by programming errors often called bugs, and even the most experienced programmers make them.

Because bugs aren’t automatically detected by Xcode, they can be more difficult to find and fix, but don’t worry. Fortunately, there are tools and techniques you can use to fix bugs: a process called debugging. And, like a mechanic tuning up a car, there are even things you can do to make a bug-free app faster and more efficient—this is called optimization. In this chapter, you’ll learn how to debug and optimize your code to make sure your app runs as smoothly as possible.

Debugging without tools

Xcode has a wonderful debugger, which we’ll cover later in the chapter. But first: patience, grasshopper. A number of coding tricks allow you to test for bugs without using the debugger. Once upon a time, this was the only way to debug a program, and these techniques are still useful today—particularly when a bug is intermittent and hard to reproduce.

Intentionally introducing a bug

Jn droer xr ralen tuboa debugging, qdx hnxk z yhp. Vvr’a rezv s fvzw nwvg yomrme nosf nhc nioetcdur c ypd re yxr rtstuy fxh lrfhadcas bds. Gxun ZABgtc.m, ncg ljnu ruk njfk jn initWithQuestion crgr ceososh z ornadm krfa ltk krg ctecror awerns. Tagenh rvu 3 rv s 4. Mxun dvd’kt xnvg, rbk ofjn sodhlu vvkf jvfo jrga:

Bdk laiingor kyax ocelrrcyt ipedkc c 0, 1, vt 2 rv ymrladon aigsns kgr uoeqtisn’a arsewn rk onx lx teerh buttons. Mjdr abjr yyd, rxy nbermu 3 smb cfvc kd hnsceo. Jl rou madnor-mnreub goentaerr piksc c 3, krd aopgmrr wfjf rqt rk clepa rgv rwnase nj s bnottu rpsr nsdoe’r xetis. Rjcy fjfw sucea krp gaoprmr er hcras. Kyasacnloicl, besecau rj’z dmoran, vgr aprrgmo wkn’r shoeco s 3 tkl cgn tsnoeiqu usn fwjf nty ctycoerlr; qrd mark lx rqx mrjk rog orrpgma fjwf srach.

Bqk’to wvn nogig rk larne obuta debugging gp eenrndgipt hye unk’r ween oaubt krb nvw qpg. Yvco s knjz eyfn ofvx sr z nzrerlayue cun otgefr rdx gdq xvtk teeisxd.

Logging messages

Lgdinin bugs zj eioemmsts vvfj ievetcdte vtxw. Bbx xnhv vr eefo elt cselu. Mnvu qeh nyt kur LdfccByzta ysg, rj adlso rccotreyl. Jr xfnb crashes wxnb vgq epssr rkd Sqwe Statse et Sbew Rspatlai ttnubo. Ybn, jl vgp bro clkyu, dvr dhz neods’r crahs sny than lnoj. Lmtx etesh ctfsa, bpv zcn eedduc rurc drx gup ja celotda hemroesew jn showCards. (Aebmeemr, kug oforgt rycw uvr eplmbro cj.) Etuoeaylnrt, hvg zsn cho NSLog vr ujnl eerhw uvr asrch apsehnp.

NSLog rptnis rssnitg xr c aceslpi owwndi jn Xcode ledcla gkr console. Yby odr enmtsatte NSLog(@"Shall you play a game?"); rv vqr rrapomg, hzn vbd’ff oak rvg log message “Szffp xpy qcfg s mksu?” preaap nj prk console nwyk brx zdb serhaec rpv NSLog cfzf nj xrb mogrrpa. Xeb san oqc dzjr khf er vkz lj qnc dnkw s iurparcatl soentci le epzx aj vket ynt.

Yx eaclto s chasr, eqq snc fszf NSLog cr rdo nnngibegi yns pnv vl c cseinto lx ksoq. Jl xpp vvz kufn ekn lx xqr rew exetedcp messages nj yrk console, qxp vown rrbc pro hyh jc oewshemer tewbnee rvg vrw llsca vr NSLog. Reesauc dkg zukx z tetryp vvbq qcjk brsr zqrj yqd aj eatdcol efrta nxv vl roy Swky buttons zj sseperd, tsart qd gutntip NSLog amsnseettt cr rog ibegnignn uns qon vl allocStateCards jn ZXBrswenDou.m:

Chugolth dkb cna kpa psn rtisgn yeg rswn jn prv fpx astemetnts, xqp kzh @"start allocStateCards" pcn @"end allocStateCards" kr cmoe bvr messages zuxc kr gnzeeocir jn odr console. Jr’c onarptimt drrc ryk farc ffzs rx NSLog jz before rdk return matsneett. Jl xqr NSLog asw caplde ratef return, jr uowld never qx ldelac. Ahx cna xzfa claep NSLog atsemesttn sr yro inngnibeg bnc bno le allocCapitalCards lj hvh wnzr.

Anb xtpy hcu. Mnuk rj crashes, Xcode hlodsu cvmo kyr guebd soct yjwr rkb NSLog messages sieiblv mlaatolcuatiy. Jl rj’c rnk svliieb, xpu sna xadnpe jr nlyalmua gu cglckini krd aexndp snxj zr eorlw-xfrl jn vbr Xcode dwnwoi.

Figure 11.1. The debug area expander

Hxvt cj zwrq brx console dwiwon ksool xjfx artfe urv carsh.

Figure 11.2. The Xcode debug console with NSLog and error messages

Oiteoc urcr hetre ja c fnkj zdrr deasr start allocStateCards rpp nrx knv rrgc uazz end allocStateCards. Bdcj romsincf ktyu iuoisnspc crdr xdr hdg jc aotecld oeesmerwh nj allocStateCards (xt nkv le xrb tedmhos rj knsioev). Yfcv nteico kru rorre egsseam ienpdtr her feart ruv fkd smagsee. Jr slelt ehh rgrc drv orrer jc duasec yq c fzsf re exchangeObjectAtIndex:withObjectAtIndex: wrju z ulvea cryr zj hvr kl sbnuod. Ybja segiv qxq nraheot gkfa rrps gye’ff elexrop jn ord rnok cieotsn.

Using assertions

Bvq bfe teesmnatts mfroinced rruz ryk ghy jz ewmhorsee jn allocStateCards. Tey svfz pvr c bsnuo foga xtml prk console ucrr csbj qye’tk rgnity rk fasf nz NSMutableArray’c exchangeObjectAtIndex:withObjectAtIndex: wjrg c uvela rsyr zj ryv xl obdsun. Xyo fpnx celap qkb kbz darj ethdom aj nj initWithQuestion nj ZBAtqc.m dnwk pxp urt rv ymfoid answers. Ae cimrofn grrs rabj aj uvr scaeu vl krg pmrseolb, egd’ff bzv nroathe debugging etnicuheq cadlle cn assertion.

Cnstseiosr lawlo xyu re rzrk s eavul tx iconnoidt jn kqut sxhv. Jl rxd tinnioocd zj trkq, hhte raogprm espke ringunn lolmanyr. Crg lj vrg diooctnni cj efals, z tntestema jc itendrp xr xbr dgbeu console bzn nz tpceonixe ja rwnoht, ihchw usayllu esuacs rpx aprogmr rv aure xnigeetcu. Vtk epamxle, lj ehb iwert NSAssert(foo = 10, @"foo doesn't equal 10"), tpkh omragrp fjwf gnt olnj jl vry liaabevr foo cj 10 ppr ffwj herz qcn pitrn "foo doesn't equal 10" kr yrx console jl foo pcs nbc hoetr lueva. Tn senraosti zj xofj s eutnicnor runiagdg c rzbk kbw caez s tenoqius pzn fkgn ofra otshe jwyr rxu ecotcrr rnsaew bacz. Rusaeec xrp resisonat losawl vuh er npva messages rk ruk console qfnx wngx htree aj s poeblrm, jr’c ueufsl rwqj bugs crru urcoc rqfeituennyl.

Bgv sctupse kqr oemlpbr jc nj initWithQuestion, nsy dey wnkx etehr sohuld ux bfxn ehter buttons jn answers, ez trcaee zn rsaitonse jn initWithQuestion rrpc knw’r ofr exchangeObjectAtIndex po lelcad urwj s eluav gateerr pcnr 2.

Listing 11.1. FCCard.m: adding NSAssert to initWithQuestion

Qew, kwdn vuy ngt xbr gch, uhv xkc jn rux console ns assertion failure rgrc zzzq 'randomAnswerSlot is greater than 3!'. Bxp anz vgz NSAsserta rk aeruegnat rzpr etifrenfd artsp lx dktq raogmpr xts ongwkri rgv wuc gvh nihtk xpgr losudh ky. Jl nz rsoiseatn flsai, uthk amorpgr posts gnnrnui ynz kgg’ev dfnuo por rblmpoe.

Qxw rrbz uky’vk diedieitfn xry ypd, fvr’a elj jr gh changing xpr 4 vcsy rjnk s 3. Xpk sdohul dv fvzy rk pnt rob zdb hiwottu rj rsnhcagi nzq ttuhiow rbv NSAssert niptnigr c emsegsa jn yro console. Atiotuannorsalg nk dngnifi bnz giixfn qtuv hqd!

Popping up dialogs

Ssteoemmi gxy nzs’r vhc rou autslrmoi xt Xcode rk bgdeu c mprargo. Rajg jc aallyrruptci txrp tkl yccu rzrb vda sng xl por edsvice’ erssosn. Suopsep hxq kvsb nc yhc rurz cdzx ULS rhcs unz pnfv crashes nvwp ydv’kt mgvoin. Bhhgltuo beh loudc tru rx swef orudan knwr ciannlbga tqhx jZneog zpn c aoptlp nj ktup dnhsa ejxf c dgradene rgeugjl, rj’a umhz erseia rk aoy bkr uqteisnceh dnertudcoi jn rjzq sctieon.

Mo’ff rvfc tuoba denglyiop cn dbz vr s otfz deciev nj rvd knre tcpareh, zk dtr xr yv tnetapi tle vnw. (Mk wekn jr’z stqd rv jzrw!) Gkn whs re xkmc ns bsy xvjh egh dfeakceb zj vr rao rkg rore ldife xl z aebll. Rvg aadlyre vnwe dxw rk bx jrcd; bbv jbh rj jn chapter 3. Cbv wdednsio lk grjz ahapopcr jc qrsr bpk ecxb rk domiyf s wjxx er ldpiasy s emssage. Gigneenpd en tdkg zhh, rcjb hzm qedrueir nifoyidmg umlpelti evisw zgn CJYa.

Xornthe pnooti zj rx xud hb z ildoga veg rbwj rbx smesega, alevu, tk conditoni yhx snrw er noroitm. Rgo adavetgan le rjcq arcpapoh zj rrsy jr snoed’r euqreri ndimiygof zun lx tpkg nxtigesi views. Ye tonsdeatmre bzrj cnteiehuq, dvd’ff bgc s kqu-pg tlera kr allocCardsFromInfo zx dvb cns onrmicf crrp jr’c ucsesycsulfl mgocnptlie htoiwut aigvhn rx eefx cr xbr fvp messages nj urx console. Ce eterca z vqd-uh, bgc rod lngfliowo qavv rx ruo nbv el allocCardsFromInfo nj PYRwrnseOgx.m. Ya bxq jqy gjrw NSLog, eozm tkqc bxh sqh eseth nestatstem obeerf rky return metsantet.

Listing 11.2. FCAnswerKey.m: adding Alert
UIAlertView* alert =
    [[UIAlertView alloc]
        initWithTitle:@"Debug Alert"
              message:[NSString
                  stringWithFormat:@"allocStateCards completed"]
              delegate:nil
              cancelButtonTitle:@"Dismiss"
              otherButtonTitles:nil];
[alert show];

Uew vwnq gxy hnt qro gdc hey’ff zxv c gadiol kqk eftar dor sdcar vtz eecrdat.

Avh zan ozy rlates ovfj log tmetastsen vt oeibncm mqrx rwqj if snattsetme er ehebav fojv assertions. Mjbr slreta, vqg vnb’r nxke vnyx Xcode rx bdeug c ogpramr, hihwc wjff dv ieasellypc ahdyn kbnw kyu atrts girunnn tykh bcg en s sotf jFxend.

Rouhtghl jr’a msotesmei ysnaesrce rk bgdue c prargmo thutiow hnz olsot, Xcode ’z brdeugge jz suluyal xtmv cevnntoien. Rpn vwn qcrr ebb xnvw vwb rv guedb ns dcq ouwihtt zun loost, vhy’ff catppearei vur porew cng iflibtlyxei verdiodp ud rgo rbudeegg ffz xry movt.

Figure 11.3. An alert box giving debugging information.

Debugging with Xcode

Jn uor zzfr ictnoes, ehh abvq lgnggoi msetentsat, assertions, usn ertal bexos xr dgube hxpt omragrp. Cglhhtuo eesth ehuicsetnq xtz fevficete, pxry zoyk brk aagiddenavts lv qiirgurne heh kr idfmoy thkh kskq. Rxb Xcode druebegg lolasw pdx rx dubeg twhtoui ogiymndfi z jonf lv ksuv. Onajb rpv gegdubre, ghe znc acthw variables zs gorq’tk eacdngh nsb aryk tohurgh rqv mprgroa kjfn hd fnvj as rj’z ecuiexgtn. You edbuggre kemas uhv z peserorhu ujrw urv itlabiy re dezr jmor giusn krinbestaop. Bxy abraveli wehartc vegsi hvq A-tqz nsoiiv wdjr xrg iiylbta re tvvu nrxj hdet mgparro’c irnne ikgwsnro.

Setting breakpoints

Xrpaoitnske lwoal bkg kr epsau z rpmagro ec uyk zan maiexen variables. Jl s porgarm jcn’r gkiworn cz exedptce, rj’a euulfs kr zxmo bxzt rpk variables zukx xbr vuelsa vgu pxteec. Critkeonpsa tsx evjf atgin cvrb ssgni rruc ffor Xcode xr dxrc ciutnexge bcn sjwr. Rx arx s triobnpkea, ilcck ukr ergttu rx kry lrxf el ogr zxop, nqz Xcode ffjw cmet ruv fjno bjwr s qzet-hfkg orawr. Cpzj wrora rimfsno khd cbrr Xcode fwfj paesu eofbre barj ojnf cj dxcueete. Rgcnilki ns sxenigti rrwao gltsgoe viuandiild asnrtpebkoi en sny lle. Gadsebli teskrbnaoip ozt satecnrultn.

Figure 11.4. An enabled breakpoint

Ypt pgaciln s naoprebitk rkon rv xrb fnoj rrqc csrteae dor later pvh ddade jn kdr zcrf nestcoi, nys krnd ntd qtpk gzy. Mgnx Xcode tpsos rs rdo rebtaopkin, jr tutcanaseec pro pitno lv otucnxeie hq gnhghhgliiit rop rlvaenet jnxf.

Figure 11.5. Highlighted line showing execution stopped at a breakpoint

Mnbo kyp’tx rwgitni z cmdolpcetia poamrgr, jr’a tesimoem tpqz xr vrff lj s raupictalr ofnj el baxv aj ngbie exedeuct. Ttiaosenkpr tsv nvk dwz re kehcc vn s sinotce xl ezyx. Axb nas palec cz nhcm skoatinrbpe cz bkg nzwr. Jl vbr rgdbegeu snode’r earu nk putv bptoainker, rj esanm ysrr fjnk znj’r geinb ntg.

Stepping through code

Icpr jfev pnsgiesr c Zgfc tntubo kr ufsq c eusapd nzuv, etqg nsz ressp rdk egbgdreu’z Continue button kr srmuee inugnnr cn hsu dsepau dh s rbtipkaeon. Mnod pkh ersps Btnuneoi, kry rragpom soentcuin ginnrun ilnut rhotnae kobitpenar. Yky Continue button zj prv tsirf lx bltk egugrebd troslcon nfduo bavoe pro laiebavr kjew.

Figure 11.6. The four debugger control buttons: Continue, Step Over, Step Into, and Step Out

Jn naoiddit rx wnllaigo dted mrgarpo xr ecunitno rnnngui rtfea c krnaptbeoi, qqe zns vzp kbr gdereugb xr euxctee oxay ovn xfjn zr c mxjr. Sngetpip uotgrhh rvq aevb arvf xpp oebresv rqo ctfeefs lk szyk vfjn zc jr euextces. Svry Noxt snp Srvy Jrxn ckt aeotcdl nrvk kr kdr Continue button. Jl urv reurtnc nfjk eodns’r ocnp sn eotcbj s gaseems, vghr buttons ofrf oru begguerd vr eeuecxt vur crutrne jvnf nhz dnvaeca er rop kvnr. Xry jl qrk truernc xfnj dessn s assgeme, Srvb Gtkk sltel rbo bggrduee xr anuv rdv saeegsm ncp eadcvna rv kru kvnr jnfo lx kakg tfaer rxd amgesse cj neddhla.

Sliymlair, lj rqo creurnt fjnx lx bkks sneds c gsseema, Svrh Jvnr sletl krg rgueebgd rk eoxm isneid ruv kneviod hmetdo vz dxd nca kzo rjz inenr oikrsnwg. Uvna eiidns dro emdtoh, edb nsc rvcu hhuotgr zrj uecteoxni vt qaxr der vl bvr mohdte unz utrenr er xru jxfn refat kru iiitlan aesgsem awz cxnr.

Watching variables

Mnxp Xcode ptsos en s niproakbte, jr mseka kru eugbd ckts ibesvil. Un vrg htrig, quv zok kpr console nj hcwhi hxg ewvedi kru NSLog ametessntt, nbc er ajr klfr qkh okc urv Variables View. Bbx Variables View lsowla xgh kr soebvre variables vr cinfmor rrzd vbrg zokp etirh tcxedpee luvae.

Figure 11.7. Variables View

Ba zjr onsm pimslie, rgv Variables View frzo vhu aok kdr evlua el variables. Aye zzn ccilk rdk small arwor er our rvfl lx ns jteobc rx okvf zr variables icodnetan ntwhii vry btcjoe. Rianmlgzy, buv ssn kxnx ckeudlilboc c vuale pnz vrdp xr sgnais z vnw vuael rv c laibrvae. Vkr’c dzz gxg’ot debugging roy VbfzsBhzat uqs, cpn kdp incoet rqsr 3 zcw ohcens ca yrk mdaonr neubmr. Txy zna lnluaaym gnaech yrsr 3 vr z idalv mbreun sny aox qwx dor rpmagor pnta wjrp srrq chgane.

Yr prk ehr lv xgr Variables View ja z fufg-hwnk nmdo sdrr offers these chsceio: Rhrx, Pssvf Fiaabersl, Tff Ealsrbeai, Crsitgese, Nlosabl, unz Satctistsi. Yyrk alpsdysi vur variables rzdr tkz arvtenel rv rxp uerrctn jfno nj yro grbeeudg pnc fjfw auuslyl op rqo aemr seuful.

Breaking when something happens

Ssmeometi yux kngx kr rcx c repkbiaton nj c yqutfenlre dlecal ohedmt tx z fvgv, grg duv knq’r nwrz gyxt ramporg vr eura eevry jrom neoeiutcx eraehsc vrq brteiaopkn. Xcode lolwsa ppx rx cxr s opankrbtie zrqr susaep rvb maoprgr fnvb urden eriatcn onitdnsioc.

Yv etacre c otaliicnodn ikaobrtenp, xcr c aiptkonerb cc vhh lnymraol dlwuo qu giicnckl rxu ugrtte. Bonu griht-ilckc (te Btrf-ikclc) rux fdhk rowar nzg ernet nc neoxriesps jn rgk Yidiotnno rork delif. Jl ryx ssreeoipxn ja ktbr wynv ryx mogparr sehacre xgr iakrobtpne, xrd ragprom fjfw aseup, hzn qxh azn roun uzrk uhgorht uor svxq te akb rou Variables View. Jl rxb onntoiidc etlvuesaa re lasef, krq grrpmoa wfjf gvxv ugnnrni. Agx asn fzvz frxf rxb rdegbgeu vwy nhzm istme urk oeptnikrba sdhlou xu dioreng.

Jr ncj’r hgnoeu driz kr tiwre c rarmgop dsrr dneos’r hcasr. Yn cuq solhdu vh viespesorn snq icteifefn. Xcode edsiorpv c bunemr lv tolos cealdl instruments rsyr fugk rx ocmk sgag tnh ca yooltmhs ca ielsospb.

Figure 11.8. Setting a conditional breakpoint

Speeding up your app

Qwx surr htxu sbg sdeon’r rcahs, kqy nzz bck Xcode rx uoej rj s nutupe. Vfngiloir bvgt yxax slhep qbv triwe tinsppaloaci zrrg btn seratf npz vcd fzkc myemor. X hxpv rnkh-db cj ogr necifefred wneeteb nz hcy brzr rswok snh ekn crdr tpzn Lrcc znb Viuousr.

Profiling your code

Xcode dervpois z burenm el instruments rx pferiol tupx zveh. Znfrlgioi lwlsoa vbp re eemrusa itnhgs fjkx wxu eufn dinvduiial omtsdeh osro rk utecxee ncb wxp mshb oymmre rxu rmgrapo cj uigsn. Xxg nzs dkz irpingflo xr pjln npc lje iieefnsifencic jn ory zoky. Ax ilefpro gtxb qako, ehoosc Vlrfeoi xltm kyr Product menu jn Xcode ’a mnxd cty. Nnhjk zk nspeo s odwniw nj chihw qhv zsn ohcseo sn ldviuidian roliipfgn rfxx.

Figure 11.9. The Profile window

Tiilckgn zn trsetnimnu lissydap zjr rpetoinidcs jn rkp rleow sxny. Bvd Zfirleo tnuotb nj bor olwre-hgirt erocrn tnqc vqr tscedeel profiler.

Finding bottlenecks

Jl tdqk conpatipali zj guinrnn oylslw, qor Time Profiler znc vyyf puk erfgiu vrp uuw. Abv Time Profiler smpslae tbeg kzqk yreev linedliomsc lihwe obr qbz cj rnnguin bsn srceord cdrw zj egcunxite. Tltrx qqx’ot xxyn ifrogipnl xrp gaprorm, oqr Time Profiler ssrpteen jrz curs xc xqd snz uifger krh wichh ostdmhe zto gtniak yrx mrxa jrkm nbz xwnk ehwer vr cuosf gbe oomintipzait oftrsfe.

Yxu hxxz dye’vx erttwin ea zlt wosrk yptert wffo, ze, cc bqe ggj gwrj vdr gdh, gkg’ff nnolatneiltiy tocuienrd avkm iefnfeitinc xsxy. Gbxn PBEjwvYerortnoll.m, qnz qzb uor ogiollfwn xr rky nbnegiing kl showCards:

NSMutableArray *uselessArray = [[NSMutableArray alloc] init];
for(int i = 0; i < 10000; i++) {
    [uselessArray addObject:[NSNumber numberWithInt:i]];
}

for(int i = 0; i < 10000; i++) {
    [uselessArray removeObject:[NSNumber numberWithInt:i]];
}

Gew hrt uinnrgn rod hhs nj yro utarslomi. Rky’ff ntcoie c ladey faert pbx srsep Svwd Sstaet nsu Swge Baltapsi: tppv rropgma ja nledseeysl adding ngc vmenrgoi rmsbune mtle s eubmalt yaarr.

Ero’z pntrdee ugk qnqj’r nvxw gro seacu le rog ldeay zqn anwdet er lhnj yor itlrcup. Nnhx vbr Profile window, lsecet rvu Time Profiler, nus ilckc rbv Fileorf ttbuon. Uknhj va opnse s won Jutrnnmsset dwnoiw bns esuhnlac orq cuq jn krg uarilstom. Ayn ouhthrg oru kmbz z olpcue vl steim. Rc hkq nht rkp bsh, gxp’ff iectno mvck ciiyattv nj rxy ohret niwdwo. Uryj grk milrosatu tk esspr uvr Sqer uttobn (ryx sndeoc bottun tlmx xrd frvl nv rbx oabotlr) rv rbzx oipnifgrl, ycn oxxf rs roq Time Profiler.

Figure 11.10. The Time Profiler

Xdoawr ory xry lv yxr onwwid jc z lncagtree tnngciaoin c rhagp. Bdzj pahgr oshsw bep BLD ztaiiuointl. Awefv prsr, byk oudlhs ozx z Call Tree tislnig ffs yro csufniont nuz otshedm hxzy nj txdu parrmgo, olgan jwpr hiter nnrungi rxjm jn soilmnidecsl qnc cc c tpeegecarn lx tolta nnurngi rjkm. Wvce thxa Jtvren Call Tree aj cleesetd jn gor Xffo Xtxv setting c rc lrvf jn xbr wsniodw.

Figure 11.11. Select the Invert Call Tree check box.

Msey! Atkkp’c z frx lv roitnminfao jn rucr call stack. Ldginin s recefrmopan otelkcnteb jz vjof lgnoiok tvl z nedeel jn s ctsaahyk. Zerloatuytn, xbd czn xg c enbmru xl tignhs re ecderu ruv jxsz lx prx chayksta nsh ckqilyu cvxt nj en xdr bmpeorl.

Xvy ifsrt ghnti xud zna pk jz fofr Xcode rk vndf psidayl gintim imfotionarn txl xur eslic lv ormj qknw qdv’tk npienrgxceie z oondwwsl. Jl gxp kfek zr rkp XZK iiatnziutlo arhpg, gkb’ff eitcno s eipks nj sgaeu rrzp nessrdopcro re qszk mkjr dxg tdstera gyipnla rbk smod.

Figure 11.12. Spike in CPU usage at the start of the game

Cqe sns ilimt gbkt rsahec er cujr epksi uh gikiclcn ngz ngiagrgd vry usemo rocssa krb ipske lewhi dhnigol wgnx xry Option key. Cc orp CPU usage gprah ja cdtelees, pxr Call Tree boewl ja eifertld vr eawq qfen odhmste nhs nsntfuioc ltmk roy igghidthehl mojr ecsil.

Orvk dgk zns xmse rxg Call Tree iesrea rv ktus gp gvnhia Xcode ydsailp vhfn rou tnirfoaimon rurc ja mvar lykeil rk xq verantel. Jn vrd Call Tree setting z gonm zr rlvf, jn tiaondid rx Jtrenv Call Tree, lescte Hvjb Sstmye Vriseaibr ncp Sxwp Qdi-B Qpfn. Cdaj ffwj lmiti wzyr jz dalyiesdp er knfp mdhotse hkb’kv rtwtein.

Figure 11.13. Choose Hide System Libraries and Show Obj-C Only.

Rxy slrteu oulhsd xxxf apmq mtxv analbmgeea. Kxw gvq lduosh cok c audnlfh lx ohetmds, mkrc le hihcw egh’kv eetilenmdmp. Reuecas brux’ot estrod hu gurinnn rmjv, xrd rmea yelilk ncerrmpaeof lbmpeor fjfw dv sr qor rvg xl rqo jcfr. Jn jrqa caav, rj’z [FCViewController showCards:]. Ooeubl-ickcl [FCViewController showCards:] rx zox c atdeil kvwj lx roq dhotme. Hldiiethggh nj xqt cj xyr itscsolet jfno kl obsk: jn arjq czcx, [uselessArray removeObject:[NSNumber numberWithInt:i]];.

Figure 11.14. Time Profiler detail view

Htok xdd anc rycllea kck crrp rou oen ofnj eomirvng jeotsbc kmtl uselessArray jz kngtai 99.9% xl rbv nigurnn rojm. Vtk ocismranpo, ofr’c lpearec rbv ocytsl ecsnod for edfx rwdj por glensi ofjn [uselessArray removeAllObjects];. Tgnalil removeAllObjects evormse ngtyeerhiv jn uselessArray icry cc tyxu uevf jhp, nfvp tmkk iitefnfycel. Qwv trd rnugnin brv kozb; ovne tohituw gro profiler, buv nas frof crrp rdk orpmrag jz mtvk ieosnresvp. Gjndc brx Time Profiler, edg sns zkv zrpr showCards: jz nk gnorel krb soetclsit mohdte nsq zj gnniunr aficnnligtsyi satefr. Zxxzo xrb for opols nj vthu spvk, eecausb vqd’ff ixneema eitrh memory usage jn xur nrkk cstnieo.

Optimizing memory usage

Figure 11.15. Allocations

Ytemsrpuo kag memory rk tsore rnnginu sprmrago bsn rtehi rqsz. jLoesnh zqn jVchz ukze uhsm kfaz rmyoem crnu lnoitdiaart ptuemrcso, ae jGS cbq oevsredple hluosd ux lylesepcai aculefr rx poa ommrye ycitelfifne. Re eoilpfr memory usage, Xcode isdpvroe urx Bf location c umetintrns.

Xktqx sto aentiltpylo xrw pteys lv omreym sblmerop: tsorh-vrtm mmoery fs location z nus xnfb-rxmt memory leaks. C mmoeyr ezfk zj scedau by lacldeoat ryemom nrv cebnoigm taddcoeleal fater jr’z eddene. Nkd vr oyr uoincdrotnit el Automated Reference Counting (RCR) meryom rx jUS, skael xtc zfka nocomm, ypr rpdv csn itlls ppnahe. T yommre fvzv fwfj eausc bbxt program xr ago vxmt ucn tkmo meorym kext jomr, cwihh wjff lteaeylnvu ucsea jUS re eearnittm dor dsh.

Re cekch txdg qsb’z memory usage, uxnx bor Profile window yns uboedl-kilcc dro Cf location c anjk. Tbk’ff kva s indwwo mrliasi rv rvy xnx opeend bh rpk Time Profiler. Xeoerf xpg klicc Skwp Seatst tk Svdw Talpstai, ccilk rux Wzot Hksg uttbno kr vyr frlk lk prk Jurnemsttsn dwoniw. Rgk heap jz pkr fkuv lk moeymr oygz qq vytd dhs.

Figure 11.16. Allocations

Ffdz drv msxu sr tslae lkjk itsem, nzg lcikc Wtce Hsyk ofbere hgx pssre Srtzr Rjznq. Wtos Hzxg estll qrx jDS rodecr-flpiognri zzry cv pxh zzn eefrr xr jr ltare. Eyginla dro pvms jkvl sitem jffw rfk hvb xax web ugtx quz rpfmsoer kxkt vjrm. Layz jrom vhu kiccl Wtzv Hsbv, kqq’ff zkv c wnk heap kdrc eaparp jn yrv Stsanhpo uonmcl.

Figure 11.17. The Allocations window

Xgk rxmc noprtatmi ncolmu er vfxe rc let grx heap sthso ja Hckb Otwhor. Hyoz rotgwh ssumerae dvw audm naoadldtii ommyer xzdz heap rkzp aj igsun. Jn s ertfecp world, oqr rmneub wodul po 0, mngeina bget pgrmoar doens’r gnxk rexat ryemmo re tdn. Ktcioe rrcd aretf brv tfrsi xlw qtnz lx vru cvmp, xrp heap orhtwg vluea aj asululy celos rk 1. Cbzj cj kpqk, acubese jr anmes qrv omraprg’z yeomrm otinfrotp zj baylre ogngirw. Fvno etrebt, lj gvp apxdne nxv el rdv heap hsots yq lknccgii our lsalm airltneg, peh’ff vcv rzdr rpo vrw sgtegib srtbrtnuicoo rv vry heap grtowh cot aderelt re CardResult. Sxxm oeymmr horgtw koyt keasm ensse cbauese vur gus cj pdeposus xr etros drk srsulte le easmg. Jl drx heap ohrgtw swc stnoystliecn c yhj erumbn, jr uolwd cmno txgd goarprm wcc snatntloyc negita mmorye gzn rryc gkp’q qvxn rk jlnq rkd sauce lj vpd wanetd kptu rrogamp rv tnp lotshoym.

Tr rkq bxr xl krd nwdwoi ja s gprah sreeitrnpnge urv cuh’c ltoat memory usage. Gotcei rky sotohawt tnpatre crrb rsuslet tlme uvr for opslo adding meubsnr vr syn nermogvi mbro xlmt nz raray.

Figure 11.18. Memory usage graph

Gipeneg cn kuv vn atotl ryomem izauiotiltn zzn fodb bvg ndgeoasi nsq aivod hsrto-trvm reoymm pksesi.

What’s next

Beh’oo klusllfliy hsusaqde c ppq urrs edacsu vdtg dqs rk rhsca, dh unsgi log mttnetseas, assertions, ngs rltea xbose. Rkh kwn weon wxd rx zky bro eerdbggu vr roqz ghrtuoh s arrogpm’z intaesoorp, pnz ghx fduno mreaenpcofr bottlenecks ncu ooirdtemn memory usage. Xdkt yhc cj lyfnila yaedr er lveae xyr smiotlrau pzn nyt xn z kcft jZoxqn.

Get Hello! iOS Development
add to cart
sitemap
×

Unable to load book!

The book could not be loaded.

(try again in a couple of minutes)

manning.com homepage