Простые вопросы для собеседования программистов под Mac OS X

Objective-C

Вопрос:
Как называется основной компилятор Apple?
Ответ:
clang - основной компилятор Apple, основан на LLVM.

Вопрос:
Как называется отладчик Apple?
Ответ:
LLDB - отладчик Apple (ранее использовался GDB).

Вопрос: 
Чем глобальные переменные отличаются от статических?
Ответ:
  • global variables - переменные доступные из любой функции в любое время. Чтобы сделать переменную глобально надо объявить ее за пределами функции. Глобальные переменные доступны в коде каждого файла программы.
  • static variable - также как глобальные переменные объявляются за пределами функции. Однако доступны только из кода в файле которого были объявлены. 
Словарик начинающего программиста на Objective-C

Вопрос:
Что будет содержать неинициализированная глобальная или статическая переменная?
Ответ:
Поддерживают инициализацию, а если ее нет то автоматически инициализируются нулем.

Вопрос:
Чем в ООП отличается метод от сообщения?
Ответ:
  • Метод, который мы вызываем, является неотъемлемым свойством объекта. Метода не существует, если объект равен null, т. е. ситуация, когда мы пытаемся вызвать метод на null, эквивалентна ошибке.
  • Сообщение отделено от объекта, который его получает. Объект, получив сообщение, может на него отреагировать или нет. Ещё одно отличие состоит в том, что отправка сообщения объекту nil является допустимой.
Как расшифровать сигнатуру метода в Objective-C

Управление памятью в Objective-C

Вопрос:
Какие есть способы для управления памятью в Objective-C?
Ответ:
1) Автоматический сборщик мусора (в OS X 10.8 был помечен как не рекомендуемый).
2) Ручное управление памятью.
3) Автоматический счетчик ссылок (ARC) - рекомендуемый механизм.
Управление памятью в Objective-C

Вопрос:
Какие атрибуты для setter-a свойства можно устанавливать при ручном управлении памятью или при управлении памятью с помощью ARC?
Ответ:
Без ARC:
  • assign - не увеличивает счетчик ссылок, при удалении объекта свойство будет указывать на не существующий объект (!)
  • retain - увеличивает счетчик использований и возвращает тот же самый объект (как бы ссылку на объект)
С ARC:
  • assign ~ weak
  • retain  ~ strong
retain - передача по ссылке, copy - по значению.
Первоначальному объекту посылается сообщение release. Может быть использовано только для объектов, поддерживающих протокол NSCopying, например NSString.

Вопрос:
При использовании ARC в чем разница между сильными и слабыми ссылками?
Ответ:
При удалении объекта на который ссылается слабая ссылка она примет значение nil и обращение по ссылке с этим значением не приведет ни к чем плохому.
При удалении объекта на который ссылается сильная ссылка она будет указывать "на ничто" и обращение по ссылке грозит крашем приложения. В лучшем случае удаления не произойдет.

Вопрос:
Чем отличается поверхностное копирование (shallow copies) объекта от глубокого копирования (deep copy)?
Ответ:
При поверхностном копировании объекта, если он содержит в себе свойства указывающие на другие объекты то копируются значения этих указателей. Поэтому в скопированным объекте эти свойства будут указывать на те же самые объекты в памяти, что и в оригинальном объекте.
Как скопировать объект полностью в Objective-C

Cocoa

Вопрос:
Что такое делегат в Cocoa?
Ответ:
Делегирование это паттерн при котором один объект координирует свои действия с другим. Делегирующий объект содержит ссылку на другой объект - делегат - и когда нужно посылает ему сообщения. Сообщение извещает делегат о том что делегирующий объект обработал или поймал событие. Делегат может ответить на событие обновив состояние своё или другого объекта, или вернуть значение, которое влияет на обработку события. Делегирование нужно для легкой настройки поведения нескольких объектов в одном центральном.

Источник данных во многом похож на делегат. Разница в связи с делегирующим объектом. Делегирующий объект, обычно view-объект такой как table view, содержит ссылку на data source и запрашивает данные для отображения.

Вопрос:
Как называется протокол по которому в Foundation Framework реализуется копирование объектов?
Ответ:
Классы из Foundation Framework уже обычно работают по <NSCopying> Protocol. Поэтому для них можно вызывать copy и mutableCopy методы.