- Bereiten Sie sich auf Ihr iOS-Interview vor
- Technische Fragen
- Frage 1
- Frage 2
- Frage 3
- Frage 4
- Frage 5
- Frage 6
- Frage 7
- Frage 8
- Frage 9
- Frage 10
- Frage 11
- Frage 12
- Frage 13
- Frage 14
- Frage 15
- Frage 16
- Frage 17
- Frage 18
- Frage 19
- Frage 20
- Standardfragen
- „Erzähl mir von dir.“
- „Beschreiben Sie ein interessantes Problem und wie Sie es gelöst haben.“
Bereiten Sie sich auf Ihr iOS-Interview vor
Der große Tag steht vor der Tür. Egal, ob es sich um ein Telefon-, Online- oder persönliches Interview handelt, es ist immer ein bisschen stressig. Um den Stress abzubauen, haben Sie einige Vorbereitungsarbeiten durchgeführt – die Hausaufgaben für das Unternehmen, mit dem Sie ein Interview führen, abgeschlossen, den Personalchef und die Hälfte des Ingenieurteams des Unternehmens Ihrer Wahl auf linkedin & github verfolgt, Sie haben einige der Fähigkeiten und Kenntnisse aufgefrischt, die Sie seit einiger Zeit nicht mehr verwendet haben – Sie sind bereit zu gehen.
Aber nach dem Motto der US Navy Seals „Zwei ist eins und einer ist keiner“ gehen wir eine weitere kurze Auffrischung durch, um Ihnen zu helfen, dieses iOS-Interview zu bestehen. Also lasst uns direkt hineingehen!
Beginnen wir mit einigen der grundlegenden Fragen, für die Sie hoffentlich bereits bereit sind. Sie mögen offensichtlich erscheinen, aber Sie wären schockiert, wie viele Ingenieure in den 12 Jahren, in denen ich technische Interviews geführt habe, kläglich versagt haben.
Technische Fragen
Ok, jetzt, wo wir das abgedeckt haben, lasst uns in die technischen Fragen springen.
Hier finden Sie die Slideshare für alle technischen Interviewfragen!
Frage 1
Zu einem UITableViewCell-Konstruktor:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
Wofür wird der reuseIdentifier
verwendet?
Das reuseIdentifier
wird verwendet, um anzuzeigen, dass eine Zelle in einem UITableView
wiederverwendet werden kann. Zum Beispiel, wenn die Zelle gleich aussieht, aber unterschiedlichen Inhalt hat. Der UITableView
verwaltet einen internen Cache von UITableViewCell
mit dem reuseIdentifier
und ermöglicht deren Wiederverwendung, wenn dequeueReusableCellWithIdentifier:
aufgerufen wird. Durch die Wiederverwendung von Tabellenzellen ist die Bildlaufleistung der Tabellenansicht besser, da keine neuen Ansichten erstellt werden müssen.
Frage 2
Erklären Sie den Unterschied zwischen atomaren und nichtatomaren synthetisierten Eigenschaften?
Atomar und nicht atomar bezieht sich darauf, ob die Setter / Getter für eine Eigenschaft atomar Werte in die Eigenschaft lesen und schreiben. Wenn das Atomschlüsselwort für eine Eigenschaft verwendet wird, wird jeder Zugriff darauf „synchronisiert“. Daher wird garantiert, dass ein Aufruf des Getters einen gültigen Wert zurückgibt, dies ist jedoch mit einer kleinen Leistungseinbuße verbunden. Daher wird in einigen Situationen nonatomic verwendet, um einen schnelleren Zugriff auf eine Eigenschaft zu ermöglichen, aber es besteht die Möglichkeit, dass eine Race-Bedingung dazu führt, dass die Eigenschaft unter seltenen Umständen Null ist (wenn ein Wert von einem anderen Thread festgelegt wird und der alte Wert wurde aus dem Speicher freigegeben, aber der neue Wert wurde dem Speicherort für die Eigenschaft noch nicht vollständig zugewiesen).
Frage 3
Erklären Sie den Unterschied zwischen Kopieren und Behalten?
Wenn ein Objekt beibehalten wird, erhöht sich die Anzahl der Beibehaltungen um eins. Dies bedeutet, dass die Instanz des Objekts im Speicher gespeichert wird, bis die Anzahl der Beibehaltungen auf Null fällt. Die Eigenschaft speichert einen Verweis auf diese Instanz und teilt dieselbe Instanz mit allen anderen, die sie ebenfalls beibehalten haben. Kopieren bedeutet, dass das Objekt mit doppelten Werten geklont wird. Es wird nicht mit jemand anderem geteilt.
Möchten Sie Ihr technisches Interview ass? Planen Sie jetzt ein technisches Interview mit einem Experten!
Frage 4
Was ist method swizzling in Objective C und warum würden Sie es verwenden?
Methode Swizzling ermöglicht die Implementierung eines vorhandenen Selektors zur Laufzeit für eine andere Implementierung in einer Klassen-Dispatch-Tabelle. Mit Swizzling können Sie Code schreiben, der vor und / oder nach der ursprünglichen Methode ausgeführt werden kann. Zum Beispiel, um die Zeit zu verfolgen, die die Ausführung der Methode gedauert hat, oder um Protokollanweisungen einzufügen
#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
Frage 5
Was ist der Unterschied zwischen nicht laufenden, inaktiven, aktiven, Hintergrund- und angehaltenen Ausführungszuständen?
- Läuft nicht: Die App wurde nicht gestartet oder ausgeführt, sondern vom System beendet.
- Inaktiv: Die App wird im Vordergrund ausgeführt, empfängt jedoch derzeit keine Ereignisse. (Möglicherweise wird jedoch anderer Code ausgeführt.) Eine App bleibt normalerweise nur kurz in diesem Zustand, wenn sie in einen anderen Zustand übergeht.
- Aktiv: Die App wird im Vordergrund ausgeführt und empfängt Ereignisse. Dies ist der normale Modus für Vordergrund-Apps.
- Hintergrund: Die App befindet sich im Hintergrund und führt Code aus. Die meisten Apps geben diesen Zustand kurz auf dem Weg zur Suspendierung ein. Eine App, die zusätzliche Ausführungszeit anfordert, kann jedoch für einen bestimmten Zeitraum in diesem Status verbleiben. Darüber hinaus tritt eine App, die direkt im Hintergrund gestartet wird, in diesen Zustand anstelle des inaktiven Zustands ein.
- Suspendiert: Die App befindet sich im Hintergrund, führt jedoch keinen Code aus. Das System verschiebt Apps automatisch in diesen Status und benachrichtigt sie vorher nicht. Während der Unterbrechung verbleibt eine App im Speicher, führt jedoch keinen Code aus. Wenn ein Speichermangel auftritt, löscht das System möglicherweise angehaltene Apps ohne vorherige Ankündigung, um mehr Platz für die Vordergrund-App zu schaffen.
Frage 6
Was ist eine Kategorie und wann wird sie verwendet?
Eine Kategorie ist eine Möglichkeit, einer Klasse zusätzliche Methoden hinzuzufügen, ohne sie zu erweitern. Es wird häufig verwendet, um eine Sammlung verwandter Methoden hinzuzufügen. Ein häufiger Anwendungsfall ist das Hinzufügen zusätzlicher Methoden zu integrierten Klassen in den Cocoa-Frameworks. Zum Beispiel das Hinzufügen asynchroner Download-Methoden zur Klasse UIImage
.
Frage 7
Können Sie den Fehler im folgenden Code erkennen und vorschlagen, wie er behoben werden kann:
@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
Alle UI-Updates müssen im Hauptthread durchgeführt werden. Im obigen Code kann die Aktualisierung des Warnungstexts im Hauptthread erfolgen oder nicht, da die globale Versandwarteschlange keine Garantien gibt. Daher sollte der Code so geändert werden, dass das UI-Update immer im Hauptthread ausgeführt wird
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(10); dispatch_async(dispatch_get_main_queue(), ^{ self.alert.text = @"Waiting over"; });});
Frage 8
Was ist der Unterschied zwischen viewDidLoad
und viewDidAppear
?
Was sollten Sie verwenden, um Daten von einem Remote-Server zu laden, um sie in der Ansicht anzuzeigen?
viewDidLoad
wird aufgerufen, wenn die Ansicht geladen wird, sei es aus einer Xib-Datei, einem Storyboard oder programmgesteuert in loadView
. viewDidAppear
wird jedes Mal aufgerufen, wenn die Ansicht auf dem Gerät angezeigt wird. Welche zu verwenden ist, hängt vom Anwendungsfall für Ihre Daten ab. Wenn die Daten ziemlich statisch sind und sich wahrscheinlich nicht ändern, können sie in viewDidLoad
geladen und zwischengespeichert werden. Wenn sich die Daten jedoch regelmäßig ändern, ist es besser, viewDidAppear
zum Laden zu verwenden. In beiden Situationen sollten die Daten asynchron in einen Hintergrundthread geladen werden, um ein Blockieren der Benutzeroberfläche zu vermeiden.
Frage 9
Welche Überlegungen benötigen Sie, wenn Sie eine UITableViewController
schreiben, die Bilder anzeigt, die von einem Remote-Server heruntergeladen wurden?
Dies ist eine sehr häufige Aufgabe in iOS und eine gute Antwort hier kann eine ganze Reihe von Kenntnissen abdecken. Die wichtige Information in der Frage ist, dass die Bilder remote gehostet werden und das Herunterladen einige Zeit in Anspruch nehmen kann. Wenn daher nach „Überlegungen“ gefragt wird, sollten Sie darüber sprechen:
- Laden Sie das Bild nur herunter, wenn die Zelle in die Ansicht gescrollt wird, dh wenn
cellForRowAtIndexPath
aufgerufen wird. - Asynchrones Herunterladen des Bildes in einen Hintergrundthread, um die Benutzeroberfläche nicht zu blockieren, damit der Benutzer weiter scrollen kann.
- Wenn das Bild für eine Zelle heruntergeladen wurde, müssen wir überprüfen, ob sich diese Zelle noch in der Ansicht befindet oder ob sie von einem anderen Datenelement wiederverwendet wurde. Wenn es wiederverwendet wurde, sollten wir das Bild verwerfen, andernfalls müssen wir zum Hauptthread zurückkehren, um das Bild in der Zelle zu ändern.
Andere gute Antworten werden über das Offline-Caching der Bilder sprechen, wobei Platzhalterbilder verwendet werden, während die Bilder heruntergeladen werden.
Frage 10
Was ist ein Protokoll und wie definieren Sie Ihr eigenes und wann wird es verwendet?
Ein Protokoll ähnelt einer Schnittstelle aus Java. Es definiert eine Liste der erforderlichen und optionalen Methoden, die eine Klasse implementieren muss / kann, wenn sie das Protokoll übernimmt. Jede Klasse kann ein Protokoll implementieren, und andere Klassen können dann Nachrichten basierend auf den Protokollmethoden an diese Klasse senden, ohne den Typ der Klasse zu kennen.
@protocol MyCustomDataSource- (NSUInteger)numberOfRecords;- (NSDictionary *)recordAtIndex:(NSUInteger)index;@optional- (NSString *)titleForRecordAtIndex:(NSUInteger)index;@end
Ein häufiger Anwendungsfall ist die Bereitstellung einer Datenquelle für UITableView
oder UICollectionView
.
Frage 11
Was ist KVC und KVO? Geben Sie ein Beispiel für die Verwendung von KVC zum Festlegen eines Werts an.
KVC steht für Key-Value Coding. Es ist ein Mechanismus, mit dem auf die Eigenschaften eines Objekts zur Laufzeit mithilfe von Zeichenfolgen zugegriffen werden kann, anstatt die Eigenschaftsnamen zur Entwicklungszeit statisch kennen zu müssen. KVO steht für Key-Value Observing und ermöglicht es einem Controller oder einer Klasse, Änderungen an einem Eigenschaftswert zu beobachten.
Angenommen, es gibt eine Eigenschaft name
für eine Klasse:
@property (nonatomic, copy) NSString *name;
Wir können mit KVC darauf zugreifen:
NSString *n =
Und wir können seinen Wert ändern, indem wir ihm die Nachricht senden:
Frage 12
Was sind Blöcke und wie werden sie verwendet?
Blöcke sind eine Möglichkeit, eine einzelne Aufgabe oder Verhaltenseinheit zu definieren, ohne eine ganze Objective-C-Klasse schreiben zu müssen. Unter den Deckblättern befinden sich immer noch Objective C-Objekte. Sie sind eine Sprachlevel-Funktion, mit der Programmiertechniken wie Lambdas und Closures in Objective-C unterstützt werden können. Das Erstellen eines Blocks erfolgt mit der Syntax ^ { }
:
myBlock = ^{ NSLog(@"This is a block"); }
Es kann so aufgerufen werden:
myBlock();
Es ist im Wesentlichen ein Funktionszeiger, der auch eine Signatur hat, mit der die Typsicherheit beim Kompilieren und zur Laufzeit erzwungen werden kann. Zum Beispiel können Sie einen Block mit einer bestimmten Signatur an eine Methode wie diese übergeben:
- (void)callMyBlock:(void (^)(void))callbackBlock;
Wenn Sie möchten, dass dem Block einige Daten zugewiesen werden, können Sie die Signatur ändern, um sie einzuschließen:
- (void)callMyBlock:(void (^)(double, double))block { ... block(3.0, 2.0);}
Frage 13
Welche Mechanismen bietet iOS zur Unterstützung von Multithreading?
-
NSThread
erstellt einen neuen Low-Level-Thread, der durch Aufrufen der Methodestart
gestartet werden kann.
NSThread* myThread = initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil];;
-
NSOperationQueue
ermöglicht die Erstellung eines Pools von Threads und die parallele Ausführung vonNSOperation
s.NSOperation
s kann auch im Hauptthread ausgeführt werden, indemNSOperationQueue
nachmainQueue
gefragt wird.
NSOperationQueue* myQueue = init];; ;
- GCD oder Grand Central Dispatch ist eine moderne Funktion von Objective-C, die eine Vielzahl von Methoden und APIs zur Unterstützung gängiger Multithreading-Aufgaben bereitstellt. GCD bietet eine Möglichkeit, Aufgaben für den Versand entweder im Hauptthread, in einer gleichzeitigen Warteschlange (Aufgaben werden parallel ausgeführt) oder in einer seriellen Warteschlange (Aufgaben werden in FIFO-Reihenfolge ausgeführt) in die Warteschlange zu stellen.
dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_async(myQueue, ^{ printf("Do some work here.\n");});
Frage 14
Was ist die Responder-Kette?
Wenn ein Ereignis in einer Ansicht auftritt, z. B. ein Berührungsereignis, löst die Ansicht das Ereignis für eine Kette von UIResponder
Objekten aus, die dem UIView
zugeordnet sind. Das erste UIResponder
ist das UIView
selbst, wenn es das Ereignis nicht behandelt, fährt es die Kette fort, bis UIResponder
das Ereignis behandelt. Die Kette wird UIViewController
s, Eltern UIView
s und ihre zugehörigen UIViewController
s enthalten, wenn keiner von denen das Ereignis behandelt, dann wird der UIWindow
gefragt, ob er damit umgehen kann und schließlich, wenn das nicht der Fall ist behandle das Ereignis dann wird der UIApplicationDelegate
gefragt.
Wenn Sie die Gelegenheit haben, diese zu zeichnen, lohnt es sich, den Interviewer zu beeindrucken:
Frage 15
Was ist der Unterschied zwischen der Verwendung eines Delegaten und einer Benachrichtigung?
Beide werden verwendet, um Werte und Nachrichten an interessierte Parteien zu senden. Ein Delegat dient der Eins-zu-Eins-Kommunikation und ist ein von Apple gefördertes Muster. Bei der Delegierung hat die Klasse, die Ereignisse auslöst, eine Eigenschaft für den Delegaten und erwartet normalerweise, dass sie einige protocol
implementiert. Die delegierende Klasse kann dann die Protokollmethoden _delegate_s aufrufen.
Notification ermöglicht es einer Klasse, Ereignisse über die gesamte Anwendung an alle interessierten Parteien zu senden. Die Broadcasting-Klasse muss nichts über die Listener für dieses Ereignis wissen, daher ist die Benachrichtigung sehr nützlich, um Komponenten in einer Anwendung zu entkoppeln.
postNotificationName:@"TestNotification" object:self];
Frage 16
Was bevorzugen Sie beim Schreiben von Benutzeroberflächen? Xib-Dateien, Storyboards oder programmgesteuert UIView
?
Es gibt keine richtige oder falsche Antwort darauf, aber es ist eine großartige Möglichkeit zu sehen, ob Sie die Vorteile und Herausforderungen jedes Ansatzes verstehen. Hier sind die häufigsten Antworten, die ich höre:
- Storyboards und Xibs eignen sich hervorragend zum schnellen Erstellen von Benutzeroberflächen, die einer Designspezifikation entsprechen. Sie sind auch wirklich einfach für Produktmanager visuell zu sehen, wie weit entlang eines Bildschirms ist.
- Storyboards eignen sich auch hervorragend, um einen Fluss durch eine Anwendung darzustellen und eine umfassende Visualisierung einer gesamten Anwendung zu ermöglichen.
- Storyboards Nachteile bestehen darin, dass sie in einer Teamumgebung nur schwer gemeinsam bearbeitet werden können, da es sich um eine einzelne Datei handelt und das Zusammenführen schwierig zu verwalten ist.
- Storyboards und Xib-Dateien können ebenfalls dupliziert werden und sind schwer zu aktualisieren. Wenn zum Beispiel alle Schaltflächen identisch aussehen müssen und plötzlich eine Farbänderung erforderlich ist, kann es ein langer / schwieriger Prozess sein, dies über Storyboards und Xibs hinweg zu tun.
- Das programmgesteuerte Konstruieren von
UIView
kann ausführlich und mühsam sein, aber es kann eine bessere Kontrolle und auch eine einfachere Trennung und gemeinsame Nutzung von Code ermöglichen. Sie können auch einfacher Unit-getestet werden.
Die meisten Entwickler schlagen eine Kombination aller 3 vor, bei denen es sinnvoll ist, Code gemeinsam zu nutzen, und dann wiederverwendbare UIView
s- oder Xib
-Dateien.
Frage 17
Wie würden Sie private Benutzerdaten sicher offline auf einem Gerät speichern? Welche anderen Best Practices für die Sicherheit sollten angewendet werden?
Auch hier gibt es keine richtige Antwort darauf, aber es ist eine großartige Möglichkeit zu sehen, wie viel eine Person in die iOS-Sicherheit gegraben hat. Wenn Sie mit einer Bank interviewen, würde ich fast definitiv erwarten, dass jemand etwas darüber weiß, aber alle Unternehmen müssen die Sicherheit ernst nehmen, also hier ist die ideale Liste von Themen, die ich in einer Antwort erwarten würde:
- Wenn die Daten extrem empfindlich sind, sollten sie niemals offline auf dem Gerät gespeichert werden, da alle Geräte knackbar sind.
- Der Schlüsselbund ist eine Option, um Daten sicher zu speichern. Die Verschlüsselung basiert jedoch auf dem PIN-Code des Geräts. Benutzer sind nicht gezwungen, eine PIN festzulegen, sodass die Daten in einigen Situationen möglicherweise nicht einmal verschlüsselt werden. Darüber hinaus kann der PIN-Code des Benutzers leicht gehackt werden.
- Eine bessere Lösung ist die Verwendung von SQLCipher, einer vollständig verschlüsselten SQLite-Datenbank. Der Verschlüsselungsschlüssel kann von der Anwendung erzwungen und vom PIN-Code des Benutzers getrennt werden.
Weitere bewährte Sicherheitsverfahren sind:
- Kommunizieren Sie mit Remote-Servern nur über SSL/HTTPS.
- Implementieren Sie nach Möglichkeit das Zertifikat-Pinning in der Anwendung, um Man-in-the-Middle-Angriffe auf öffentliches WLAN zu verhindern.
- Löschen Sie sensible Daten aus dem Speicher, indem Sie sie überschreiben.
- Stellen Sie sicher, dass die gesamte Validierung der übermittelten Daten auch auf der Serverseite ausgeführt wird.
Frage 18
Was ist MVC und wie ist es in iOS implementiert?
Was sind einige Fallstricke, die Sie damit erlebt haben? Gibt es Alternativen zu MVC?
MVC steht für Model, View, Controller. Es ist ein Entwurfsmuster, das definiert, wie Logik bei der Implementierung von Benutzeroberflächen getrennt werden soll. In iOS stellt Apple UIView
als Basisklasse für alle _View_s zur Verfügung, UIViewController
wird bereitgestellt, um den Controller zu unterstützen, der Ereignisse in einer Ansicht abhören und die Ansicht aktualisieren kann, wenn sich Daten ändern. Das Modell repräsentiert Daten in einer Anwendung und kann mit beliebigen NSObject
implementiert werden, einschließlich Datensammlungen wie NSArray
und NSDictionary
.
Einige der Fallstricke, die Leute treffen, sind aufgebläht UIViewController
und Code nicht in Klassen jenseits des MVC-Formats zu trennen. Ich würde wärmstens empfehlen, einige Lösungen dafür zu lesen:
- 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
In Bezug auf Alternativen ist dies ziemlich offen. Die gebräuchlichste Alternative ist MVVM mit ReactiveCocoa , aber andere umfassen VIPER und die Verwendung von funktionalem reaktivem Code.
Frage 19
Ein Produktmanager in Ihrem Unternehmen meldet, dass die Anwendung abstürzt. Was machen Sie?
Dies ist eine großartige Frage in jeder Programmiersprache und wurde wirklich entwickelt, um zu sehen, wie Sie Ihr Problem lösen. Sie erhalten nicht viele Informationen, aber einige Interviews geben Ihnen im Laufe der Zeit weitere Details zu dem Problem. Einfach starten:
- holen Sie sich die genauen Schritte, um es zu reproduzieren.
- Finden Sie das Gerät heraus, iOS-Version.
- Haben sie die neueste Version?
- Holen Sie sich Geräteprotokolle, wenn möglich.
Sobald Sie es reproduzieren können oder weitere Informationen haben, beginnen Sie mit der Verwendung von Werkzeugen. Nehmen wir an, es stürzt wegen eines Speicherlecks ab, ich würde erwarten, dass jemand vorschlägt, das Speicherleck-Tool zu verwenden. Ein wirklich beeindruckender Kandidat würde anfangen, über das Schreiben eines Komponententests zu sprechen, der das Problem reproduziert und das Debuggen durchläuft.
Andere Variationen dieser Frage sind die langsame Benutzeroberfläche oder das Einfrieren der Anwendung. Auch hier ist die Idee zu sehen, wie Sie das Problem lösen, welche Tools Sie kennen, die helfen würden, und wissen Sie, wie Sie sie richtig verwenden.
Frage 20
Was ist AutoLayout? Was bedeutet es, wenn eine Einschränkung von iOS „gebrochen“ wird?
AutoLayout ist eine Möglichkeit, UIView
mit einer Reihe von Einschränkungen auszulegen, die die Position und Größe relativ zu anderen Ansichten oder basierend auf expliziten Werten angeben. AutoLayout erleichtert das Entwerfen von Bildschirmen, die die Größe und das Layout ihrer Komponenten basierend auf der Größe und Ausrichtung eines Bildschirms besser anpassen. _Constraint_s einschließen:
- Einstellen des horizontalen / vertikalen Abstands zwischen 2 Ansichten
- Einstellen der Höhe / Breite als Verhältnis zu einer anderen Ansicht
- Eine Breite / Höhe / ein Abstand kann ein expliziter statischer Wert sein
Manchmal stehen Einschränkungen in Konflikt miteinander. Stellen Sie sich zum Beispiel ein UIView
mit 2 Höhenbeschränkungen vor: Einer sagt, machen Sie das UIView
200px hoch, und der zweite sagt, machen Sie die Höhe doppelt so hoch wie eine Schaltfläche. Wenn die iOS-Laufzeit diese beiden Einschränkungen nicht erfüllen kann, muss sie nur eine auswählen. Der andere wird dann von iOS als „kaputt“ gemeldet.
Standardfragen
„Erzähl mir von dir.“
Das ist WIRKLICH knifflig! So viele Leute lesen ihren Lebenslauf laut vor (und ich schaue ihn mir genau an!), listet jede Klasse auf, die sie am College belegt haben, jede Position, die sie jemals innehatten (und das summiert sich wirklich für die leitenden Ingenieure) und jede Verantwortung (die oft in 2 oder 3 Unternehmen, in denen eine bestimmte Person gearbeitet hat, gleich ist). Also, 20 Minuten später, ich weiß immer noch nichts Neues / außerhalb des Lebenslaufs über den Kandidaten, wir sind 20 Minuten drin, und bis dahin glaube ich, dass sie genauso gut Roboter sein könnten (und Roboter passen in der Regel nicht sehr gut zu dynamischen Teams).
Also tun Sie sich selbst (und dem Personalchef) einen Gefallen, indem Sie einen 2min langen Elevator Pitch Ihres Hintergrunds vorbereiten – halten Sie es einfach, prägnant und kurz und fügen Sie am Ende etwas Persönliches hinzu. Liebst du Laufen? Trainierst du die Fußballmannschaft deiner Tochter? Eingefleischter Star Wars Fan? Ein bisschen Persönlichkeit hinzuzufügen ist ein großartiger Eisbrecher, und wird für einen erstaunlichen Übergang in den tieferen Teil des Interviews sorgen.
„Beschreiben Sie ein interessantes Problem und wie Sie es gelöst haben.“
Ihre Chance, diese zu hören, ist im Grunde 99%, also haben Sie besser eine großartige Antwort für sie bereit! Hier sind ein paar Tipps: Denken Sie an ein besonders tolles Projekt, auf das Sie stolz sind. Verstanden? Großartig! Nehmen Sie nun ein Stück Papier und fassen Sie es in 5 Aufzählungspunkten zusammen.
1. Aufzählungszeichen- sehr kurze Hintergrundgeschichte der Umstände hinter dem Projekt
2. Aufzählungszeichen- die Art des Projekts selbst
3. Aufzählungszeichen – die Probleme, auf die Sie bei der Lösung gestoßen sind
4. bullet- Wie haben Sie die obigen Schwierigkeiten gelöst?
5. Aufzählungszeichen – was haben Sie daraus gelernt.
Suchen Sie sich nun jemanden, der Ihnen zuhört (einen Freund, Partner, Kollegen) und fragen Sie ihn, ob die Geschichte Sinn macht (abzüglich technischer Aspekte, wenn die Person, mit der Sie sprechen, nicht Ihr Kollege ist). Es ist eine großartige Möglichkeit zu überprüfen, ob die Geschichte zusammenhält.
Sie wären schockiert, wie oft ich Dinge gehört habe wie „und dann ging ich zu John, und er benutzte das Werkzeug, das er geschaffen hat, um den kritischen Fehler zu entfernen, der dann ……“. Wer ist Tom? Ihr Manager? Praktikant? Peer? Warum bist du zu ihm von allen in deiner Firma gegangen? Was ist das magische Werkzeug, das er zusammengestellt hat? Welcher kritische Fehler genau wurde entfernt und wie? Was war das Ergebnis?
Sie bekommen die Idee
Zusätzlicher Bonus? Sie haben jetzt 5 Aufzählungspunkte, die Sie während Ihres Interviews als Spickzettel verwenden können, ohne wie DER Typ auszusehen, der seinen Lebenslauf laut vorliest.
Lassen Sie uns nun auf die SELTSAMEN Fragen eingehen, die einige Personalchefs gerne stellen, um Ihnen einen Tipp von Ihrem Spiel zu geben.
- Wie würden Sie einen Toaster testen?
- Wie viele Stifte passen in ein Flugzeug?
- Wie viele Fenster gibt es in San Francisco?
- Wie viele Golfbälle passen in einen Schulbus?
- Wie viele Big Macs verkauft McDonald’s jedes Jahr in den USA?
Die Liste geht weiter und weiter. Es hat zwar nichts mit Ihren technischen Fähigkeiten zu tun, aber es überprüft gut, wie Sie mit Kurvenbällen umgehen und ob Sie in der Lage sind, logische Schritt-für-Schritt-Probleme zu lösen. In den meisten Fällen gibt es keine perfekten Antworten auf diese Art von Fragen (obwohl Sie sie zu Ihrer Beruhigung googeln können). Es geht darum, wie Sie Ihrem Interviewer Ihre Logik erklären.
Hier ist die Antwort auf die Golfballfrage von Michael Beauchamp, damit Sie eine Vorstellung davon bekommen, wovon ich spreche:
Ich denke, ein Standard-Schulbus ist etwa 8 Fuß breit und 6 Fuß hoch und 20 Fuß lang – dies ist nur eine Vermutung, basierend auf den Tausenden von Stunden, die ich hinter Schulbussen gefangen war, während der Verkehr in alle Richtungen gestoppt wird.
Das bedeutet 960 Kubikfuß und da es 1728 Kubikzoll in einem Kubikfuß gibt, bedeutet das ungefähr 1,6 Millionen Kubikzoll.
Ich berechne das Volumen eines Golfballs auf etwa 2,5 Kubikzoll (4/3 * pi * .85) als .85 Zoll ist der Radius eines Golfballs.
Teilen Sie diese 2,5 Kubikzoll in 1.6 millionen und Sie kommen mit 660.000 Golfbällen. Da es jedoch Sitze und Mist gibt, die Platz beanspruchen, und da die Kugelform eines Golfballs bedeutet, dass beim Stapeln ein beträchtlicher leerer Raum zwischen ihnen vorhanden ist, werde ich auf 500.000 Golfbälle abrunden.
Sehen Sie? Schritt für Schritt. Und plötzlich ist es eine relativ einfache, logische Frage. Bleib einfach ruhig und anstatt zu versuchen, eine sofortige Nummer in deinem Kopf zu finden, führe den Interviewer mit dir durch deinen Gedankengang.
Brauchen Sie Praxis im wirklichen Leben? Planen Sie ein Scheininterview mit Matt, der seit 12 Jahren technische Interviews führt, und fragen Sie nach seinem Feedback!