Пользователь
0,0
рейтинг
23 октября 2013 в 13:42

Разработка → Вопросы на собеседование middle/senior iOS Developer

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

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

Networking & Multithreading:
— Что такое 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/retain. :)))
— Что такое 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, а какой в Cache?

А какие Вам задавали вопросы на собеседованиях?
P.S. Спасибо Василию Мирончуку за содействие при подготовке данного материала.
@IgorFedorchuk
карма
10,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (57)

  • +26
    Всё, конечно, здорово, вопросов много разноплановых. Хотелось бы увидеть от вас вторую статью с развёрнутыми ответами теперь.
  • +5
    Да, в дальнейшем планирую написать ответы. А эта статья поможет проверить текущие знания iOS.
    • +1
      И где же ответы? :)) Уже больше года прошло :)
  • +6
    Эти вопросы могут стать началом серии tutorial'ов по iOS development :)
  • +2
    Кто-то подскажет что-то похожее для C# WPF и C# WP? Можно и для джуников тоже.
    • 0
      Я по C# WP даже вакансий еще не видел)
  • +19
    Неважно, умеешь ли ты программировать. Важно, отвечаешь ли ты на вопросы или нет.
    Непонятна категоризация вопросов. В networking попали вопросы по мультитредингу, в UIKit — вопросы по экосистеме.
    Ребята, с любым из этих вопросов можно разобраться в ходе работы. Проверяйте мозги, а не начитку.
    • +4
      Часто, смысл собеседования проверить не только мозги, но и понизить твою самооценку, что несомненно повлияет на уровень запросов соискателя. Т.е. это повод для работодателя сбить цену. Иначе, я ничем не могу объяснить реально дебильные, совершенно не практические вопросы на собеседованиях.
      • 0
        Приведите пару примеров того, что вы понимаете под практическими вопросами?
    • 0
      если человек не знает что ответить, то достаточно посмотреть на то как он рассуждает, для этого и нужны каверзные вопросы
  • +10
    — Напишите код, который разворачивает строку на С++.

    что значит разворачивает?

    Networking:
    — Что такое deadlock?
    — Что такое livelock?
    — Что такое семафор?
    — Что такое мьютекс?
    вы серьезно? какое отношение имеют эти вопросы к Networking

    и ни одного вопроса по алгоритмике и структурам данных
    • +2
      И ни одного по архитектуре, ну кроме б-гомерзкого синглетона)
    • +1
      +1, разворачивает — если я верно понимаю — переставить символы в строке в обратном порядке. А так мне тоже этот тест не понравился.
  • –1
    — Напишите код, который разворачивает строку на С++.
    Это означает, что «abcd» на входе и «dcba» на выходе.

    вы серьезно? какое отношение имеют эти вопросы к Networking
    Изменил на Networking & Multithreading

    и ни одного вопроса по алгоритмике и структурам данных
    На полноту обзора всех тем на собеседовании этот топик не претендует. В статье упомянуты вопросы, которые автор получал/задавал на собеседованиях.
  • +7
    Я бы предпочел проверять у кандидатов не уровень абстрактного знания, а умение работать. Эти вещи связаны довольно слабо.
    • –1
      А как еще проверить умение работать? Можно с помощью тестового задания, но я лично, если это не гиганты рынка, отказался бы от его выполнения, дав ссылку на гитхаб, где лежит мой опенсорсный код. Потому что тратить день-два на его выполнение мне не хочется. А задание на 1-2 часа нет смысла давать, потому что оно ничего не покажет. Так что как ни крути, а без технических вопросов на собеседовании никак не обойтись.
      • 0
        >дав ссылку на гитхаб, где лежит мой опенсорсный код

        А этого было бы достаточно. Зачем мне после этого спрашивать про абстрактные классы?
  • 0
    > — Как удалить объект в ходе итерации по циклу?

    Какой объект?
    • +1
      — Что такое responder chain?

      Раз говорим о паттернах, так может их и называть правильно? «Chain of responsibility»
      pthread_create(&thread, NULL, startTimer, (void *)t);

      Для чего при разработке под iOS использовать POSIX-потоки?
      — Atomic vs nonatomic. Чем отличаются? Как вручную переопределить atomic/nonatomic сеттер в не ARC коде?

      А что нет вопроса как это сделать с использованием ARC?
      • –1
        Раз говорим о паттернах, так может их и называть правильно? «Chain of responsibility»
        Вот ссылка на документацию
        Для чего при разработке под iOS использовать POSIX-потоки?
        Мы же говорим о позиции middle/senior.
        А что нет вопроса как это сделать с использованием ARC?
        Если кандидат умеет это делать в не ARC коде, то под ARC ему это не составить труда.
        • +1
          Вот ссылка на документацию

          И правда по другому называется у них, просто привык к GOF'у…
          Мы же говорим о позиции middle/senior.

          А чем реально то они лучше чем GCD или NSOperationQueue вместе с NSOperation? Приходилось ри реально использовать POSIX и как в этом были прюсы? Реально, просто интересно…
          • 0
            Тоже непонимаю, почему не используется NSThread. Зачем мешать всё в одну кучу?
            • 0
              Ну и это тоже есть, конечно. Просто для каких-то сложных вещей уже не подходит. Например, NSOperation уммеет всякие зависимости выставлять, то есть ожидание завершения какой-то другой операции…
          • –1
            В данном примере использован POSIX для отвлечения внимания. Можно с тем же успехом использовать и другие технологии. Мне не приходилось использовать POSIX в проектах, где я учавствовал.
            Вот что можно найти в документации по поводу использования POSIX:
            Use POSIX calls if cross-platform portability is required. If you are writing networking code that runs exclusively in OS X and iOS, you should generally avoid POSIX networking calls, because they are harder to work with than higher-level APIs. However, if you are writing networking code that must be shared with other platforms, you can use the POSIX networking APIs so that you can use the same code everywhere.


          • 0
            Я pthread_* сам не использовал, однако неоднократно встречал его применение в различных opensource-библиотеках. Грамотного разработчика применение pthread не должно смутить.
    • –1
      Имелась в виду такая ситуация. Есть mutable массив объектов, есть айди объекта, который надо удалить из массива. Как удалить объект с данным айди из массива?
      • 0
        ОК. А какие варианты ответа подходят?

        1. Запомнить объект и удалить.
        2. Запомнить индекс и удалить.
        3. Использовать filtered…
        4. Сет индексов при удалении нескольких объектов.

        Может есть ещё какие, которые необходимо знать?
        • –1
          Я так понимаю смысл в том, что бы удалять объекты во время реверсивного обхода массива, а не наоборот, дабы избежать выхода за пределы его.
  • +2
    На мой взгляд, чем больше подходов к решению проблемы кандидат может придумать, тем лучше.
    Может есть ещё какие, которые необходимо знать?
    Я может не смог донести суть статьи до читателей, но я не хотел сказать, что если ты не можешь ответить на все вопросы, то ты не senior. Или что если ты ответил, то ты мегакрут. Суть статьи в том, чтобы показать моменты, на которые стоит обратить внимание перед собеседованием.
  • 0
    Пассивная/активная модель это anemic/rich model что ли?
    • 0
      Об активной/пассивной модели можно почитать тут и тут. Если верить MSDN, то Application Programming in Smalltalk-80: How to use Model-View-Controller (MVC) [Burbeck92], Steve Burbeck — это первоисточник.
      • 0
        Спасибо. Не задумывался об этом.
  • –3
    Смог ответить на все вопросы :)
    Я Junior :)
    • 0
      вопрос только в том, насколько правильно вы на них ответили :-)
      • 0
        Судя по гуглу, правильно :)
        • 0
          большинство вопросов требуют пояснений, а не ответа. Поэтому мне всё-же не понятно как вы по гуглу судите.
          • 0
            1. Развернуто отвечаю на вопрос сам, для себя.
            2. Ищу в гугле ответ и литературу по ответу, сверяюсь.

            А что не так в том, чтобы судить по гуглу?
  • 0
    Стандартное желание — такое бы, да для Android…
  • –6
    UIKit:
    — Что такое Run Loop?

    Бугага ))) Автор, не гони!
    • +1
      Выдержка из правил сайта:
      Хабр — для спокойных людей. Всегда будет кто-то, кто, по вашему мнению, ни разу не прав. Однако просим оставить хамство, грубость, переходы на личности и прочие проявления агрессии и неадекватности для других ресурсов — на Хабре это не в почёте.
  • +1
    Спасибо большое, с большинством вопросов не согласен, но некоторые забрал.
    Добавлю парочку своих:
    По CoreAnimation
    — чем отличается UIView от CALayer
    — какие типы CALayer есть?
    — чем отличается UIView based Animation от Core Animation
    — тайминги в CoreAnimation
    — что такое backing store
    — чем отличаются аффинные преобразования от трехмерных

    Core Data
    — что такое Fault и зачем он нужен
    — как происходят изменения в NSManagedObjectContext
    — синхронизация разных типов NSManagedObjectContext (получение и изменение данных в child контекстах).
    — зачем нужен NSPersistentStoreCoordinator
    — зачем нужно делать двустороннии связи в таблицах
    — что таке Fetched Property и особенности работы с ним по сравнению с обычной связью

    Ну то что сразу на ум пришло. Обычно вообще вопросы придумываю по ходу общения.
    • 0
      По поводу вот этого вопроса:
      — Зачем все свойства ссылающиеся на делегаты strong/retain. :)))

      Я не понял, почему он должен быть strong? Вообще не могу в голове придумать ни одной причины чтоб он в любом случае должен быть таким? Более того могу придумать причины, почему такого делать нельзя, например когда два объекта в самом простом случае являются делегатами друг друга. Во избежании циклической связи один из них должен быть weak.
      Делегата же может и вообще не быть, почему тогда исключать возможность, что он может пропасть в любой момент, если нам не нужно гарантировать его постоянное присутствие?
      • 0
        Вы правы, именно поэтому стоит смайл в конце вопроса. Это вопрос с подвохом.
    • 0
      вот этот вопрос в недоумении вообще вгоняет:
      — Асинхронность vs многопоточность. Чем отличаются?

      Он лично для меня звучит как «в чем разница между ведром и лопатой». Что автор имел ввиду я думаю в процессе собеседования уточнить можно, но так в общем виде это звучит некорректно.
      • +1
        У меня на интервью по С++ был вопрос
        — В чем разница между виртуальными функциями и полиморфизмом?

        Правильный ответ:
        — Полиморфизм — это теоретическая фича ООП, а виртуальные функции — это имплементация полиморфизам в С++.

        Я к тому, что разница между Асинхронностью и многопоточностью имеется. Понятия взаимосвязанные, но разные.
    • 0
      — Как можно заимплементировать autorelease pool на с++?

      «заимплементировать» — реализовать :-)
      зачем на С++, вообще причем он здесь. Если уже проверять знания языка, то С. С++ каким тут боком?
      А этот вопрос я бы сформулировать как: напишите простую реализацию NSAutoreleasePoll на Objective-C
      • 0
        можно и на objective-c. Cуть — выяснить как человек понимает работу NSAutoreleasePoll. Большинство вопросов провокационных. И цель их — услышать рассуждения. 100% правильного ответа может и не существовать. На своем опыте могу сказать, что после того, как объяснил интервьюверу, как реализовать NSAutoreleasePoll на плюсах, то лучше понял его(NSAutoreleasePoll) работу.
        • +1
          какой еще Poll?
  • +1
    Очень странный список. На приличное количество вопросов не отвечу, не очень понятно что делаю на позиции senior developer'а :)
    Зачем, к примеру, спрашивать про core data, если в проекте оно не используется? Разве как-то изменит впечатление, если человек его знает, но больше ничего не расскажет? И наоборот — всюду понравился, а с core data не работал и ничего сказать не сможет.

    Вообще говоря, мне кажется, что все эти вопросы спрашивать в принципе не нужно. Как говаривал мой преподаватель по матану: «На экзамене билет дается исключительно для того, чтобы преподавателю было с чего начать разговор со студентом». Так и тут — начинаешь с чего-то привычного, а дальше уже как кривая выведет. Подобные разговоры дают гораздо лучшее представление о кандидате.
    • 0
      Мне, как интервьюверу, не важно ответите Вы правильно или нет. Важны Ваши рассуждения в ходе раздумий. На это, по-моему, надо делать упор.
      • 0
        Рассуждения это хорошо, я так и написал. Вот только каких рассуждений вы ждете на вопрос «что такое мьютекс?», если человек не знает ответ?
        • –1
          Вопросы типа «что такое мьютекс?» нужны, чтобы понять в каких областях человек работал и как глубоко он в них разобрался. А ответ на этот конкретный вопрос надо знать, потому что он из общего программирования.
          • –1
            Не ответил что такое мьютекс, симафор, хеш — не взяли на работу в Польше. Остальные вопросов 20 по практике ответил развернуто и правильно. Так что да, без основ никуда.
  • 0
    Я один не понимаю, зачем iOS Delevoper'у нужен C++?
    • 0
      Например, вы разработчик iOS, Android, Windows Mobile(Phone). Написали собственную обертку для OpenGL ES на C++. Подключаете её в свои проекты. Пишете для неё unit-тесты и спокойной дорабатываете.

      У меня есть проект на ObjC с подключением OCR библиотеки написанной на C++, использующей OpenCV.
      • 0
        Тогда давайте еще добавим вопросов по Java/C# и другим языкам программирования. На них тоже можно делать кроссплатформу для телефона.

        Но тут же вроде вакансия на чистого iOS девелопера. И что тут делает C++, который ему не нужен?
        • 0
          C, C++, ObjC — это все таки очень близкие друг-другу языки, и они абсолютно безболезненно могут сосуществовать в одном проекте на iOS\OS X. Junor'у C++ конечно не нужен, но утверждать что он не нужен мидлу, а тем более сеньеру — по крайней мере странно.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.