Вопросы на собеседование middle/senior iOS Developer

от автора

Все мы ходили/ходим на собеседования. Каждый раз при подготовки к очередному собеседованию просматриваем основные темы, вспоминаем вопросы, которые нам задавали в предыдущие разы, или вопросы, которые сами задавали. Ниже хочу представить основные вопросы, которые часто (основано на личном опыте) можно получить на собеседовании на должность middle/senior iOS Developer. Так сказать, шпаргалка. Заодно можно проверить свой уровень знания платформы.

General:
— Чем абстрактный класс отличается от интерфейса?
— Расскажите о паттерне MVC. Чем отличается пассивная модель от активной?
— Реализация синглтона в ARC и в non-ARC?
— Какие еще паттерны знаете?
— Напишите код, который разворачивает строку на С++.

Networking:
— Что такое deadlock?
— Что такое livelock?
— Что такое семафор?
— Что такое мьютекс?
— Асинхронность vs многопоточность. Чем отличаются?
— Преимущества и недостатки синхронного и асинхронного соединения?
— Что означает http, tcp?
— Какие различия между HEAD, GET, POST, PUT?
— Какие технологии в iOS возможно использовать для работы с потоками. Преимущества и недостатки.
— Чем отличается dispatch_async от dispatch_sync?
— Выведется ли в дебагер «Hello world»? Почему?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     dispatch_sync(dispatch_get_main_queue(), ^{         NSLog(@"Hello world");     });     /* Another implementation */    return YES; } 

— Что выведется в консоль?

    NSObject *object = [NSObject new];     dispatch_async(dispatch_get_main_queue(), ^     {         NSLog(@"A %d", [object retainCount]);         dispatch_async(dispatch_get_main_queue(), ^         {             NSLog(@"B %d", [object retainCount]);         });         NSLog(@"C %d", [object retainCount]);     });     NSLog(@"D %d", [object retainCount]); 

CoreData:
— Что такое Core Data?
— В каких случаях лучше использовать SQLite, а в каких Core Data?
— Что такое Managed object context?
— Что такое Persistent store coordinator?
— Какие есть нюансы при использовании Core Data в разных потоках? Как синхронизировать данные между потоками?
— Использовали ли NSFetchedResultsController? Почему?

Objective-C
— Какие существуют root классы в iOS? Для чего нужны root классы?
— Что такое указатель isa? Для чего он нужен?
— Что происходит с методом после того, как он не нашелся в объекте класса, которому его вызвали?
— Чем категория отличается от расширения (extention, неименованная категория)?
— Можно ли добавить ivar в категорию?
— Когда лучше использовать категорию, а когда наследование?
— Какая разница между использованием делагатов и нотификейшенов?
— Как происходит ручное управление памятью в iOS?
— autorelease vs release?
— Что означает ARC?
— Что делать, если проект написан с использованием ARC, а нужно использовать классы сторонней библиотеки написанной без ARC?
— Weak vs assign, strong vs copy?
— Atomic vs nonatomic. Чем отличаются? Как вручную переопределить atomic/nonatomic сеттер в не ARC коде?
— Зачем все свойства ссылающиеся на делегаты strong/retaine. :)))
— Что такое autorelease pool?
— Как можно заимплементировать autorelease pool на с++?
— Чем отличается NSSet от NSArray? Какие операции быстро происходят в NSSet и какие в NSArray?
— Formal vs informal protocol.
— Есть ли приватные или защищенные методы в Objective-C?
— Как имитировать множественное наследование?
— Что такое KVO? Когда его нужно использовать?
— Что такое KVC? Когда его нужно использовать?
— Что такое блоки? Зачем они нужны?
— Когда нужно копировать блок? Кто за это ответственен: caller или reciever?
— Что такое designated initializer?
— Что не так с этим кодом? Зачем нужны инициализаторы?

[[[SomeClass alloc] init] init]; 

— Как удалить объект в ходе итерации по циклу?
— Сработает ли таймер? Почему?

void startTimer(void *threadId)  {    [NSTimer  scheduleTimerWithTimeInterval:10.0f        target:aTarget            selector:@selector(tick: )            userInfo:nil            repeats:NO]; }  pthread_create(&thread, NULL, startTimer, (void *)t); 

— Какой метод вызовется: класса A или класса B? Как надо изменить код, чтобы вызвался метод класса A?

@interface A : NSObject  - (void)someMethod;  @end  @implementation A  - (void)someMethod {     NSLog(@"This is class A"); }  @end  @interface B : A @end  @implementation B  - (void)someMethod {     NSLog(@"This is class B"); }  @end  @interface C : NSObject @end  @implementation C  - (void)method {     A *a = [B new];     [a someMethod]; }  @end 

— В каких случаях лучше использовать strong, а в каких copy для NSString? Почему?

@property (nonatomic, strong) NSString *someString; @property (nonatomic, copy) NSString *anotherString; 

— Что выведется в консоль? Почему?

- (BOOL)objectsCount {     NSMutableArray *array = [NSMutableArray new];     for (NSInteger i = 0; i < 1024; i++)     {         [array addObject:[NSNumber numberWithInt:i]];     }     return array.count; }  - (void)someMethod {     if ([self objectsCount])     {         NSLog(@"has objects");     }     else     {         NSLog(@"no objects");     } } 

UIKit:
— Что такое Run Loop?
— Чем отличается frame от bounds?
— Что такое responder chain?
— Если я вызову performSelector:withObject:afterDelay: – объекту пошлется сообщение retain?
— Какие бывают состояния у приложения?
— Как работают push нотификации?
— Цикл жизни UIViewController?
— Как происходит обработка memory warning? Зависит ли обработка от версии iOS?
— Как лучше всего загрузить UIImage c диска(с кеша)?
— Какой контент лучше хранить в Documents, а какой в Cash?

А какие Вам задавали вопросы на собеседованиях?
P.S. Спасибо Василию Мирончуку за содействие при подготовке данного материала.

ссылка на оригинал статьи http://habrahabr.ru/post/198612/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *