- gör dig redo för din iOS-intervju
- tekniska frågor
- Fråga 1
- fråga 2
- fråga 3
- fråga 4
- fråga 5
- Fråga 6
- Fråga 7
- Fråga 8
- fråga 9
- Fråga 10
- fråga 11
- Fråga 12
- fråga 13
- fråga 14
- fråga 15
- fråga 16
- fråga 17
- fråga 18
- fråga 19
- Fråga 20
- standardfrågor
- ”berätta om dig själv.”
- ” beskriv ett intressant problem och hur du löste det.”
gör dig redo för din iOS-intervju
den stora dagen kommer upp. Oavsett om det är en telefon, online eller personligen intervju är det alltid lite stressande. Så, för att lindra den stress du gjorde lite förberedande arbete – avslutade läxorna på företaget du intervjuar med, stalked anställningschefen och hälften av ingenjörsteamet på det företag du väljer på linkedin & github, du borstade upp några av de färdigheter och kunskaper du inte har använt på ett tag – du är redo att gå.
men efter US Navy Seals motto” två är en och en är ingen ” låt oss gå igenom en annan snabb uppdatering för att hjälpa dig ace att iOS intervju. Så låt oss komma in i det!
låt oss börja med några av de grundläggande frågorna som jag hoppas att du redan är redo för. De kan verka uppenbara, men du skulle bli chockad över hur många ingenjörer som misslyckades eländigt på dem under de 12 år jag har gjort tekniska intervjuer.
tekniska frågor
Ok, nu när vi har det täckt, låt oss hoppa in i de tekniska frågorna.
se här för slideshare för alla tekniska intervjufrågor!
Fråga 1
på en uitableviewcell-konstruktör:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
vad används reuseIdentifier
för?
reuseIdentifier
används för att indikera att en cell kan återanvändas i en UITableView
. Till exempel när cellen ser likadan ut, men har olika innehåll. UITableView
upprätthåller en intern cache på UITableViewCell
med reuseIdentifier
och låter dem återanvändas när dequeueReusableCellWithIdentifier:
anropas. Genom att återanvända tabellcellens rullningsprestanda i tableview är bättre eftersom nya vyer inte behöver skapas.
fråga 2
förklara skillnaden mellan atom-och icke-atomiska syntetiserade egenskaper?
Atomic och non-atomic hänvisar till huruvida setters / getters för en egenskap kommer atomically läsa och skriva värden till egenskapen. När atomnyckelordet används på en egenskap kommer all åtkomst till den att ”synkroniseras”. Därför garanteras ett samtal till getteren att returnera ett giltigt värde, men detta kommer med en liten prestationsstraff. Därför används i vissa situationer nonatomic för att ge snabbare åtkomst till en egenskap, men det finns en chans att ett rasförhållande orsakar att egenskapen blir noll under sällsynta omständigheter (när ett värde ställs in från en annan tråd och det gamla värdet släpptes från minnet men det nya värdet har ännu inte tilldelats helt till platsen i minnet för egenskapen).
fråga 3
förklara skillnaden mellan kopiera och behålla?
att behålla ett objekt betyder att behållarantalet ökar med ett. Detta innebär att förekomsten av objektet kommer att hållas i minnet tills det är behålla räkna sjunker till noll. Fastigheten lagrar en hänvisning till den här instansen och delar samma instans med någon annan som behöll den också. Kopiera betyder att objektet kommer att klonas med dubbla värden. Det delas inte med någon annan.
vill du ace din tekniska intervju? Planera en teknisk Intervjuövning med en expert nu!
fråga 4
vad är metod swizzling i mål C och varför skulle du använda den?
metod swizzling tillåter genomförandet av en befintlig väljare som ska kopplas vid körning för en annan implementering i en klasser dispatch tabell. Swizzling kan du skriva kod som kan köras före och/eller efter den ursprungliga metoden. Till exempel kanske för att spåra tidsmetoden exekvering tog, eller för att infoga logguttalanden
#import "UIViewController+Log.h"@implementation UIViewController (Log) + (void)load { static dispatch_once_t once_token; dispatch_once(&once_token, ^{ SEL viewWillAppearSelector = @selector(viewDidAppear:); SEL viewWillAppearLoggerSelector = @selector(log_viewDidAppear:); Method originalMethod = class_getInstanceMethod(self, viewWillAppearSelector); Method extendedMethod = class_getInstanceMethod(self, viewWillAppearLoggerSelector); method_exchangeImplementations(originalMethod, extendedMethod); }); } - (void) log_viewDidAppear:(BOOL)animated { ; NSLog(@"viewDidAppear executed for %@", ); }@end
fråga 5
Vad är skillnaden mellan icke-löpande, inaktiva, aktiva, Bakgrunds-och avstängda exekveringstillstånd?
- inte igång: Appen har inte lanserats eller körts men avslutades av systemet.
- inaktiv: appen körs i förgrunden men tar för närvarande inte emot händelser. (Det kan dock köra annan kod.) En app stannar vanligtvis bara i detta tillstånd när den övergår till ett annat tillstånd.
- aktiv: appen körs i förgrunden och tar emot händelser. Detta är det normala läget för förgrundsappar.
- Bakgrund: appen är i bakgrunden och exekveringskod. De flesta appar går in i detta tillstånd kort på väg att avbrytas. En app som begär extra exekveringstid kan dock förbli i detta tillstånd under en tidsperiod. Dessutom går en app som lanseras direkt i bakgrunden in i detta tillstånd istället för det inaktiva tillståndet.
- avstängd: appen är i bakgrunden men kör inte kod. Systemet flyttar appar till detta tillstånd automatiskt och meddelar dem inte innan de gör det. Medan avstängd, en app förblir i minnet men inte köra någon kod. När ett tillstånd med lågt minne uppstår kan systemet rensa avstängda appar utan föregående meddelande för att ge mer utrymme för förgrundsappen.
Fråga 6
Vad är en kategori och när används den?
en kategori är ett sätt att lägga till ytterligare metoder i en klass utan att utvidga den. Det används ofta för att lägga till en samling relaterade metoder. Ett vanligt användningsfall är att lägga till ytterligare metoder för inbyggda klasser i Kakaoramarna. Till exempel lägga till async nedladdningsmetoder till klassen UIImage
.
Fråga 7
kan du upptäcka felet i följande kod och föreslå hur du fixar det:
@interface MyCustomController : UIViewController @property (strong, nonatomic) UILabel *alert; @end @implementation MyCustomController - (void)viewDidLoad { CGRect frame = CGRectMake(100, 100, 100, 50); self.alert = initWithFrame:frame]; self.alert.text = @"Please wait..."; ; dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(10); self.alert.text = @"Waiting over"; } ); } @end
alla UI-uppdateringar måste göras på huvudtråden. I koden ovanför kan uppdateringen till varningstexten hända eller inte hända på huvudtråden, eftersom den globala sändningskön inte ger några garantier . Därför bör koden ändras för att alltid köra UI-uppdateringen på huvudtråden
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(10); dispatch_async(dispatch_get_main_queue(), ^{ self.alert.text = @"Waiting over"; });});
Fråga 8
Vad är skillnaden mellan viewDidLoad
och viewDidAppear
?
vilken ska du använda för att ladda data från en fjärrserver för att visa i vyn?
viewDidLoad
anropas när vyn laddas, vare sig från en Xib-fil, storyboard eller programmatiskt skapad i loadView
. viewDidAppear
anropas varje gång vyn presenteras på enheten. Vilket som ska användas beror på användningsfallet för dina data. Om data är ganska statisk och inte sannolikt kommer att ändras kan den laddas i viewDidLoad
och cachas. Men om data ändras regelbundet är det bättre att använda viewDidAppear
för att ladda det. I båda situationerna bör data laddas asynkront på en bakgrundstråd för att undvika att blockera användargränssnittet.
fråga 9
vilka överväganden behöver du när du skriver en UITableViewController
som visar bilder som laddas ner från en fjärrserver?
Detta är en mycket vanlig uppgift i iOS och ett bra svar här kan täcka en hel mängd kunskap. Den viktiga informationen i frågan är att bilderna är värd på distans och de kan ta tid att ladda ner, därför när det ber om ”överväganden”, bör du prata om:
- ladda bara ner bilden när cellen rullas in i vyn, dvs. när
cellForRowAtIndexPath
anropas. - ladda ner bilden asynkront på en bakgrundstråd för att inte blockera användargränssnittet så att användaren kan fortsätta rulla.
- när bilden har laddats ner för en cell måste vi kontrollera om den cellen fortfarande finns i vyn eller om den har återanvänts av en annan data. Om den har återanvänts bör vi kassera bilden, annars måste vi byta tillbaka till huvudtråden för att ändra bilden på cellen.
andra bra svar kommer att fortsätta att prata om offline caching av bilderna, med hjälp av platshållarbilder medan bilderna laddas ner.
Fråga 10
Vad är ett protokoll, och hur definierar du ditt eget och när används det?
ett protokoll liknar ett gränssnitt från Java. Den definierar en lista över obligatoriska och valfria metoder som en klass måste/kan implementera om den antar protokollet. Varje klass kan implementera ett protokoll och andra klasser kan sedan skicka meddelanden till den klassen baserat på protokollmetoderna utan att den vet typen av klassen.
@protocol MyCustomDataSource- (NSUInteger)numberOfRecords;- (NSDictionary *)recordAtIndex:(NSUInteger)index;@optional- (NSString *)titleForRecordAtIndex:(NSUInteger)index;@end
ett vanligt användningsfall är att tillhandahålla en datakälla för UITableView
eller UICollectionView
.
fråga 11
vad är KVC och KVO? Ge ett exempel på att använda KVC för att ställa in ett värde.
KVC står för Nyckelvärdeskodning. Det är en mekanism genom vilken ett objekts egenskaper kan nås med hjälp av strängens vid körning snarare än att statiskt känna till egenskapsnamnen vid utvecklingstiden. KVO står för Key-Value observation och tillåter en styrenhet eller klass att observera ändringar i ett fastighetsvärde.
låt oss säga att det finns en egenskap name
på en klass:
@property (nonatomic, copy) NSString *name;
vi kan komma åt det med KVC:
NSString *n =
och vi kan ändra det värde genom att skicka det meddelandet:
Fråga 12
vad är block och hur används de?
block är ett sätt att definiera en enda uppgift eller beteendeenhet utan att behöva skriva en hel Objective-C-klass. Under täcken är blocken fortfarande objektiva C-objekt. De är en språknivåfunktion som gör att programmeringstekniker som lambdas och stängningar kan stödjas i Objective-C. Att skapa ett block görs med ^ { }
– syntaxen:
myBlock = ^{ NSLog(@"This is a block"); }
det kan åberopas som så:
myBlock();
det är i huvudsak en funktion pekare som också har en signatur som kan användas för att genomdriva typ säkerhet vid kompilering och runtime. Till exempel kan du skicka ett block med en specifik signatur till en metod som så:
- (void)callMyBlock:(void (^)(void))callbackBlock;
om du ville att blocket skulle få vissa data kan du ändra signaturen för att inkludera dem:
- (void)callMyBlock:(void (^)(double, double))block { ... block(3.0, 2.0);}
fråga 13
vilka mekanismer tillhandahåller iOS för att stödja multi-threading?
-
NSThread
skapar en ny tråd på låg nivå som kan startas genom att anropa metodenstart
.
NSThread* myThread = initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil];;
-
NSOperationQueue
tillåter att en pool av trådar skapas och används för att utföraNSOperation
s parallellt.NSOperation
s kan också köras på huvudtråden genom att frågaNSOperationQueue
förmainQueue
.
NSOperationQueue* myQueue = init];; ;
- GCD eller Grand Central Dispatch är ett modernt inslag i Objective-C som ger en rik uppsättning metoder och API: er att använda för att stödja vanliga multi-threading-uppgifter. GCD ger ett sätt att köa uppgifter för sändning på antingen huvudtråden, en samtidig kö (uppgifter körs parallellt) eller en seriell kö (uppgifter körs i FIFO ordning).
dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_async(myQueue, ^{ printf("Do some work here.\n");});
fråga 14
Vad är Svarskedjan?
när en händelse inträffar i en vy, till exempel en touch-händelse, kommer vyn att avfyra händelsen till en kedja av UIResponder
objekt som är associerade med UIView
. Den första UIResponder
är UIView
själv, om den inte hanterar händelsen fortsätter den upp i kedjan tills UIResponder
hanterar händelsen. Kedjan kommer att innehålla UIViewController
s, förälder UIView
s och deras associerade UIViewController
s, om ingen av dem hanterar händelsen frågas UIWindow
om den kan hantera den och slutligen om det inte hanterar händelsen frågas UIApplicationDelegate
.
om du får möjlighet att dra ut den här är det värt att göra för att imponera på intervjuaren:
fråga 15
Vad är skillnaden mellan att använda en delegat och anmälan?
båda används för att skicka värden och meddelanden till intresserade parter. En delegat är för en-till-en-kommunikation och är ett mönster som främjas av Apple. I delegation kommer klasshöjningshändelserna att ha en egenskap för delegaten och förväntar sig vanligtvis att den implementerar några protocol
. Den delegerande klassen kan sedan anropa protokollmetoderna _delegate_s.
anmälan tillåter en klass att sända händelser över hela programmet till alla berörda parter. Sändningsklassen behöver inte veta något om lyssnarna för den här händelsen, därför är anmälan mycket användbar för att hjälpa till att koppla bort komponenter i en applikation.
postNotificationName:@"TestNotification" object:self];
fråga 16
vad föredrar du när du skriver användargränssnitt? Xib-filer, Storyboards eller programmatisk UIView
?
det finns inget rätt eller fel svar på detta, men det är bra sätt att se om du förstår fördelarna och utmaningarna med varje tillvägagångssätt. Här är de vanliga svaren jag hör:
- storyboards och Xib är bra för att snabbt producera användargränssnitt som matchar en designspecifikation. De är också väldigt enkla för produktchefer att visuellt se hur långt längs en skärm är.
- Storyboards är också bra för att representera ett flöde genom en applikation och tillåta en högnivåvisualisering av en hel applikation.
- Storyboards nackdelar är att de i en lagmiljö är svåra att arbeta med tillsammans eftersom de är en enda fil och sammanslagningen har blivit svår att hantera.
- Storyboards och Xib-filer kan också drabbas av dubbelarbete och bli svåra att uppdatera. Till exempel om alla knappens behov av att se identiska och plötsligt behöver en färgförändring, kan det vara en lång/svår process att göra detta över storyboards och xibs.
- programmatiskt konstruera
UIView
’s kan vara utförlig och tråkiga, men det kan möjliggöra större kontroll och även enklare separation och delning av kod. De kan också lättare enhetstestas.
de flesta utvecklare kommer att föreslå en kombination av alla 3 där det är vettigt att dela kod, sedan återanvändas UIView
s eller Xib
filer.
fråga 17
hur skulle du säkert lagra privata användardata offline på en enhet? Vilka andra säkerhets bästa metoder bör vidtas?
återigen finns det inget rätt svar på detta, men det är ett bra sätt att se hur mycket en person har grävt i iOS-säkerhet. Om du intervjuar med en bank skulle jag nästan definitivt förvänta mig att någon skulle veta något om det, men alla företag måste ta säkerhet på allvar, så här är den perfekta listan över ämnen som jag förväntar mig att höra i ett svar:
- om data är extremt känslig bör den aldrig lagras offline på enheten eftersom alla enheter är knäckbara.
- nyckelringen är ett alternativ för att lagra data säkert. Men det är kryptering är baserad på pin-koden för enheten. Användarens tvingas inte ställa in en pin-kod, så i vissa situationer kan data inte ens krypteras. Dessutom kan användarens pin-kod enkelt hackas.
- en bättre lösning är att använda något som SQLCipher som är en helt krypterad SQLite-databas. Krypteringsnyckeln kan verkställas av applikationen och separeras från användarens pin-kod.
andra säkerhets bästa praxis är:
- kommunicera endast med fjärrservrar via SSL / HTTPS.
- om möjligt implementera certifikatfästning i applikationen för att förhindra man-in-the-middle-attacker på offentlig WiFi.
- rensa känslig data ur minnet genom att skriva över den.
- se till att all validering av data som skickas också körs på serversidan.
fråga 18
Vad är MVC och hur implementeras det i iOS?
Vad är några fallgropar du har upplevt med det? Finns det några alternativ till MVC?
MVC står för Model, View, Controller. Det är ett designmönster som definierar hur man skiljer ut logik när man implementerar användargränssnitt. I iOS tillhandahåller Apple UIView
som en basklass för alla _View_s, UIViewController
tillhandahålls för att stödja styrenheten som kan lyssna på händelser i en vy och uppdatera vyn när data ändras. Modellen representerar data i en applikation och kan implementeras med valfri NSObject
, inklusive datainsamlingar som NSArray
och NSDictionary
.
några av de fallgropar som människor träffar är uppblåsta UIViewController
och skiljer inte ut kod i klasser utöver MVC-formatet. Jag rekommenderar starkt att du läser upp några lösningar på detta:
- https://www.objc.io/issues/1-view-controllers/lighter-view-controllers/
- https://speakerdeck.com/trianglecocoa/unburdened-viewcontrollers-by-jay-thrash
- https://programmers.stackexchange.com/questions/177668/how-to-avoid-big-and-clumsy-uitableviewcontroller-on-ios
när det gäller alternativ är detta ganska öppet. Det vanligaste alternativet är MVVM med ReactiveCocoa, men andra inkluderar VIPER och använder funktionell reaktiv kod.
fråga 19
en produktchef i ditt företag rapporterar att applikationen kraschar. Vad gör du?
Detta är en stor fråga i alla programmeringsspråk och är verkligen utformad för att se hur du problem lösa. Du får inte mycket information, men vissa intervjuer kommer att ge dig mer information om problemet när du går vidare. Börja enkelt:
- få exakta steg för att reproducera det.
- ta reda på enheten, iOS-versionen.
- har de den senaste versionen?
- hämta enhetsloggar om möjligt.
när du kan återskapa den eller har mer information sedan börja använda verktyg. Låt oss säga att det kraschar på grund av en minnesläcka, jag förväntar mig att se någon föreslå att använda Instrumentläckverktyg. En riktigt imponerande kandidat skulle börja prata om att skriva ett enhetstest som reproducerar problemet och felsöker genom det.
andra varianter av denna fråga inkluderar långsam UI eller ansökan frysning. Återigen är tanken att se hur du löser problem, vilka verktyg vet du om det skulle hjälpa och vet du hur du använder dem korrekt.
Fråga 20
Vad är AutoLayout? Vad betyder det när en begränsning ”bryts” av iOS?
AutoLayout är ett sätt att lägga ut UIView
s med hjälp av en uppsättning begränsningar som anger plats och storlek baserad i förhållande till andra vyer eller baserat på explicita värden. AutoLayout gör det lättare att designa skärmar som ändrar storlek och layout ut sina komponenter bättre baserat på storleken och orienteringen av en skärm. _Constraint_s inkluderar:
- ställa in det horisontella / vertikala avståndet mellan 2 vyer
- ställa in höjden / bredden som ett förhållande i förhållande till en annan vy
- en bredd/höjd/avstånd kan vara ett explicit statiskt värde
ibland strider begränsningar mot varandra. Tänk dig till exempel en UIView
som har 2 höjdbegränsningar: man säger att UIView
200px är hög, och den andra säger att höjden är dubbelt så hög som en knapps höjd. Om iOS runtime inte kan uppfylla båda dessa begränsningar måste den bara välja en. Den andra rapporteras sedan som” trasig ” av iOS.
standardfrågor
”berätta om dig själv.”
det här är verkligen knepigt! Så många läser sitt CV högt (glömmer att jag tittar rätt på det!), listar varje klass de tog på college, varje position de någonsin har haft (och det lägger verkligen upp för Seniornivåingenjörerna) och varje ansvar (vilket ofta råkar vara detsamma över 2 eller 3 företag som viss person har arbetat på. Så, 20 minuter senare, vet jag fortfarande inte något nytt/utanför CV om kandidaten, vi är 20 minuter in, och då tror jag att de lika bra kan vara robotar (och robotar tenderar att inte passa mycket bra med dynamiska lag).
så gör dig själv (och anställningschefen) en tjänst genom att förbereda en 2min lång hisshöjd i din bakgrund – håll det enkelt, kortfattat och kortfattat och lägg sedan till något personligt i slutet. Älskar du att springa? Tränar du din dotters fotbollslag? Die hard Star Wars fan? Att lägga till lite personlighet i är en stor isbrytare, och kommer att göra en fantastisk övergång till den djupare delen av intervjun.
” beskriv ett intressant problem och hur du löste det.”
din chans att höra den här är i grunden 99%, så du har bättre ett bra svar redo för dem! Här är några tips: Tänk på ett särskilt fantastiskt projekt som du är stolt över. Uppfattat? Toppen! Ta nu ett papper och sammanfatta det i 5 punkter.
1st bullet point-mycket kort backstory av omständigheterna bakom projektet
2nd bullet – arten av själva projektet
3rd bullet-de problem du har stött på när du löser det/dem
4thbullet – hur löste du svårigheterna ovan
5th bullet point – vad har du lärt dig av det.
hitta nu någon som lyssnar (en vän, partner, kollega) och fråga dem om historien är meningsfull (minus några tekniska aspekter av det om personen du pratar med inte är din peer). Det är ett bra sätt att validera om historien håller sig ihop.
du skulle bli chockad över hur många gånger jag har hört saker som ”och sedan gick jag till John, och han använde verktyget han har skapat för att ta bort det kritiska felet som då……”. Vem är Tom? Din chef? Praktikant? Peer? Varför gick du till honom av alla i ditt företag? Vad är det magiska verktyget som han har satt ihop? Vilket kritiskt fel tog det exakt bort och hur? Vad var resultatet?
du förstår tanken
extra bonus? Du har nu 5 punkter som du kan använda som fuskark under din intervju utan att se ut som den killen som läser sitt CV högt.
låt oss nu hoppa in i de konstiga frågorna som vissa anställningschefer gillar att kasta in för att tipsa dig om ditt spel.
- hur skulle du testa en brödrost?
- hur många pennor kan du passa in i ett flygplan?
- hur många fönster finns i San Francisco?
- hur många golfbollar får plats i en skolbuss?
- hur många Big Macs säljer McDonalds varje år i USA?
listan fortsätter och fortsätter. Även om det inte har något att göra med dina tekniska färdigheter, gör det ett bra jobb med att kontrollera hur du hanterar kurvbollar och för att se om du kan lösa logiska steg-för-steg-problem. I de flesta fall finns det inte perfekta svar på den typen av frågor (även om du kan google dem för din sinnesfrid). Det handlar om hur du förklarar din logik för din intervjuare.
här är svaret på Golfbollsfrågan från Michael Beauchamp, så du får tanken på vad jag pratar om:
jag räknar med att en vanlig skolbuss är ungefär 8ft bred med 6ft hög med 20 fot lång – det här är bara en gissning baserad på de tusentals timmar jag har fångats bakom skolbussar medan trafiken i alla riktningar är stoppad.
det betyder 960 kubikfot och eftersom det finns 1728 kubiktum i en alnfot betyder det cirka 1,6 miljoner kubiktum.
jag beräknar volymen på en golfboll till cirka 2,5 kubiktum (4/3 * pi * .85) som .85 tum är radien för en golfboll.
dela den 2,5 kubiktum i 1.6 miljoner och du kommer med 660 000 golfbollar. Men eftersom det finns platser och skit i det tar upp utrymme och även eftersom den sfäriska formen av en golfboll innebär att det kommer att finnas betydande tomt utrymme mellan dem när staplade, jag runda ner till 500.000 golfbollar.
se? Stegvis. Och plötsligt är det en relativt enkel, logisk fråga. Håll dig bara lugn, och istället för att försöka komma med ett omedelbart nummer i ditt huvud, gå intervjuaren genom ditt tankegång med dig.
behöver verkliga livet praktiken? Boka gärna en mockintervju med Matt, som har gjort tekniska intervjuer i 12 år, och be om hans feedback!