-
Что такое полиморфизм?
- Полиморфизм - это одно из главных составляющих ООП. Полиморфизм даёт возможность объектам с одинаковым интерфейсом иметь различную реализацию и позволяет использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Реализация может быть изменена в процессе наследования. Это позволяет создавать абстрактные программы и повторно использовать код.
-
Что такое инкапсуляция? Что такое нарушение инкапсуляции?
- Инкапсуляция - это сокрытие реализации и внутренней структуры класса, а также ограничение доступа к внутренней структуре. Нарушение инкапсуляции - это раскрытие внутренней реализации класса, а также использование полей класса в обход диспетчеризации (геттеры, сеттеры).
-
Чем абстрактный класс отличается от интерфейса?
- Абстрактный класс - может иметь поля, методы, но имеет хотя бы один абстрактный (не определенный) метод. Интерфейс - чистый абстрактный класс, в котором не может быть свойств и не опередены методы. От абстрактного класса наследуются и реализуют абстрактный метод. Интерфейс реализуют или полностью, или частично (тогда это будет новый абстрактный класс).
-
Расскажите о паттерне
MVC. Чем отличается пассивная модель от активной?MVC- model(модель)-view(представление, вид)-controller(контроллер) - паттерн, в котором модель приложения, пользовательский интерфейс и взаимодействие с пользователем разделены и насколько возможно независимы. Пассивная модель MVC не может воздействовать на представление или контроллер. В этом случае модель используется как источник данных. Изменения отслеживает контроллер и перерисовывает представление. Активная модель оповещает вид о произошедших изменениях, а вид, которому нужно знать о изменениях, следит за этими изменениями. В этом случае достигается независимость модели как от контроллера, так и от вида.
-
Реализация синглтона (
Singleton) вARCи вnon-ARC?Singleton- породающий шаблон, который гарантируюет, что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа. Может последовать вопрос: "Почему бы не использовать статические методы класса?" Ответ: Статические методы класса не дают широкую функциональность в отличие от единственного объекта класса. Кроме того, в будущем может понадобится несколько объектов. Реализация безARC:
+ (Singleton *)sharedInstance {
static Singleton *sharedInstance = nil;
@synchronized(self) {
if (!sharedInstance) {
sharedInstance = [[Singleton alloc] init];
}
}
return sharedInstance;
}Реализация c помощью ARC:
+ (Singleton *)sharedInstance {
static dispatch_once_t pred;
static Singleton *sharedInstance = nil;
dispatch_once(&pred, ^{ sharedInstance = [[self alloc] init]; });
return sharedInstance;
}- Порождающие паттерны, создания объектов (Creational)?
- абстрактная фабрика (abstract factory): абстрактный класс, который предоставляет интерфейс для создания объектов. Программист должен наследоваться от него и переопределять эти методы (реализовать интерфейс абстрактной фабрики). В
Objective Cпаттерн реализуется через 1. Протокол с необходимыми методами 2. Классы, реализующие этот протокол 3. Класс, возвращающий объектid<Protocol>в зависимости от аргумента. - строитель (builder): в этом случае отделяется создание объекта и его наполнение. За свойства объекта и его состояние отвечает строитель. В
Objective Cнужно сделать конструкторinitWithBuilder:(ClassBuilder*)builder. - фабричный метод (factory method): интерфейс для создания объекта предоставляет абстрактный класс, причём объект будет возвращатся с помощью виртуального метода. Тип возвращаемого может быть абстрактным, а реализация возвращает наследников абстрактного типа. В
Objective Cэто достигается различными именами конструктора (initWithData, initWithTite). - ленивая инициализация (lazy initialization) - отложенная инициализация объекта, объекта создается в момент обращения к нему. В
Objective Cсвойство объекта не создаётся в конструкторе, а создаётся в геттере:
- (Class*)customProperty { if (!_customProperty) { _customProperty = [[Class alloc] init]; } return _customProperty; }
- объектный пул (object pool);
- прототип (prototype);
- одиночка (singleton).
- абстрактная фабрика (abstract factory): абстрактный класс, который предоставляет интерфейс для создания объектов. Программист должен наследоваться от него и переопределять эти методы (реализовать интерфейс абстрактной фабрики). В
- Структурные паттерны - шаблоны проектирования, в которых рассматривается, как из классов и объектов образуются более крупные структуры. Они используют наследование для составления композиций из интерфейсов и реализаций. Примеры:
MVC,Decorator(Categories, Delegation),Adapter(Delegation),Facade,Composite. - Патерны поведения и взаимодействия объектов (
Behavioral):Observer (Notification): определяет зависимость типа "один ко многим" между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом и автоматически обновляются. Реализуется в классомNSNotificationCenter.KVO:key-value observing. В этом случае наблюдатель следит не за событиями, а за конкретным свойством объекта. Когда значение этого свойства меняется, наблюдателю приходит уведомление, и он соответствующим образом реагирует.[object addObserver:self forKeyPath:@"property" options:NSKeyValueObservingOptionNew context:nil];Memento(UserDefaults): Хранитель фиксирует состояние объекта и сохраняет его. Дальше это сохранённое состояние может быть восстановлено без нарушения инкапсуляции, т.е. закрытые (private) члены класса остаются закрытыми.[[NSUserDefaults standardUserDefaults] setInteger:currentAlbumIndex forKey:@"currentAlbumIndex"];.Archiving- когда объект реализует протоколNSCoding:[aCoder encodeObject:self.value forKey:@"value"];,_value = [aDecoder decodeObjectForKey:@"value"];Chain of Responsibility: группа объектов обрабатывают сообщения; все сообщения должны быть обработаны хотя бы одним объектом; сообщения в системе обрабатываются по схеме «обработай сам либо перешли другому», то есть одни сообщения обрабатываются на том уровне, где они получены, а другие пересылаются объектам иного уровня.Command(Target-Action mechanism)
- Как работают push нотификации?
- iOS запрашивает у сервера Apple Push Notification Service (APNS) токен девайса. Приложение получает токен девайса. Можно считать, что токен – это адрес для отправки push-уведомлений. Приложение отправляет токен девайса на ваш сервер. Когда произойдёт какое-либо событие для вашего приложения, сервер отправит push-уведомление в APNS. APNS отправит push-уведомление на девайс пользователя.
- Опишите
основные понятия ООПв терминах Objective-C (интерфейс, реализация, свойства, протоколы,и т.д) - Что такое назначеный инициализатор (
designated initializer).- Это главный инициализатор, все остальные методы, создающие класс, вызывают этот метод.
- Суть
рантайма (Runtime), отправление сообщения- сишные функции, которые производят манипулирование классами(class_addMethod,class_addIvar,class_replaceMethod), создание новых классов (class_allocateClassPair,class_registerClassPair), интроспекция (class_getName,class_getSuperclass,class_getInstanceVariable,class_getProperty,class_copyMethodList,class_copyIvarList,class_copyPropertyList), манипулирование объектами (objc_msgSend,objc_getClass,object_copy), работу с ассоциативными ссылками. Отправка сообщений:[array insertObject:foo atIndex:1];->objc_msgSend(array, @selector(insertObject:atIndex:), foo, 1);. Ассоциативные ссылки:objc_setAssociatedObject(self, &key, newProperty, OBJC_ASSOCIATION_RETAIN_NONATOMIC);objc_getAssociatedObject(self, &key);
- Объявление свойств (
property):retain- ручное управление памятью (устарело),assign- для примитивов (для указателей будет тупое присваивание адреса),copy- объект копируется в момент присваивания,nonatomic- для работы в одном потоке, более быстрый,atomicпотокобезопасен, блокирует одновременный доступ, более медленный.
- В чем разница между
точечной нотациейи использованием квадратных скобок?- При точечной нотации происходит диспетчеризация через геттер и сеттер (если они переопределены).
- Что происходит когода мы пытаемся вызвать метод у nil указателя?
- Ничего.
- Разница между nil и Nil?
#define (id)0 nil- указатель на нулевой объект.#define (Class*)0 Nil- нулевой указатель типаClass.
- Что такое селектор (
selector)?- Это по сути строковое сообщение, которое посылается объекту, и он выполняет метод, ассоциированый с этим селектором.
- Как его вызвать?
[self performSelector:@selector(method)];
- Как отложить вызов селектора?
[self performSelector:@selector(method) withObject:obj afterDelay:delay];
- Что делать если селектор имеет много параметров?
@selector(method:::)- двоиточий столько сколько параметров.
(NSInvocation)- Вызывает метод у объекта, можно менять параметры и цель.
- Как запустить селектор во фоновом потоке?
[self performSelectorInBackground:selector withObject:obj];
- Что такое делегат (
delegate)?- объект, который использует другой объект для реализации тех или иных функций.
- Как представлены
структуры C(CGRect, CGSize, CGPoint) в Objective-C?struct CGRect {},typedef struct CGRect CGRect
- Чем объект Objective-c отличается от структуры С, что такое структура в С.
- ?????
- Какие существуют
root-классы в iOS?NSPbject,NSProxy,Protocol,Class.
- Для чего нужны
root-классы?NSObject- корневой класс для всех классов, реализует базовую функциональность.NSProxy- позволяет преварительно конфигурировать группы объектов по определённым шаблонам.
- Как имитировать множественное наследование?
- Наследоваться от класса, который в свою очередь наследуется от другого класса и т.д.
- Что такое тип
id.id- это указатель на любой НЕПРИМИТИВНЫЙ объект. ВARCнельзя сконвертировать примитив вid.
- Разница между
NSObjectиid?- Все непримитивные объекты являются типом
id. Типуidможно посылать какие угодно сообщения. ОбъектуNSObjectможно посылать только декларированые у него сообщения. Явное указание типа объекта помогает компилятору искать нужные методы и разрешать неоднозначности.
- Все непримитивные объекты являются типом
- Что случится во время компиляции если мы посылаем сообщение объекту типа
id?- Выполнит соответствуюший метод, если найдёт, иначе выбросит исключение.
- Что произойдет здесь (компиляция + время выполнения):
NSString *s = [NSNumber numberWithInt:3]; int i = [s intValue];- Выдаст предупреждение о несоответствии типов указателей, но выполняется правильно.
- Что такое указатель
isa?- Указатель на
Classдля данного объекта. Каждый объект имеет ссылку на свой класс черезisa.
- Указатель на
- Что происходит с методом после того, как он не нашелся в объекте класса?
- Возбуждается исключение
NSUnknownException.
- Возбуждается исключение
- Чем категория отличается от расширения (
extension)?- В категории объявляются дополнительные методы. В расширении добавляются методы и поля.
- Можно ли добавить
ivarв категорию?- Да.
Class c = objc_allocateClassPair([NSObject class], "Person", 0); class_addIvar(c, "firstName", sizeof(id), log2(sizeof(id)), @encode(id)); Ivar firstNameIvar = class_getInstanceVariable(c, "firstName");
- Когда лучше использовать
категорию, а когданаследование?- Категория используется, чтобы не плодить классы, только добавить нужный метод. Наследование используется для переопределения существующих методов.
- Какая разница м/у использование делегатов и
notification?- Они принадлежат к различным шаблонам проектирования.
- В чем разница между
NSArrayиNSMutableArray?- Первый неизменяемый, второй изменяемый.
- Чем отличается
NSSetотNSArray?NSSetхранит только уникальные объекты.
- Какие операции происходят быстро в
NSSetи какие вNSArray?NSArray: добавление, удаление.NSSetиспользуетhashvaluesдля поиска объекта, является неупорядоченным.
- Формальный и неформальный протокол?
- Неформальный протокол - категория над
NSObject, которая заставляет все объекты адаптировать этот протокол. Формальный - обычный протокол@protocol
- Неформальный протокол - категория над
- Есть ли
приватные и защищенныеметоды в Objective-C?- Да.
@public,@private@protected. Фактически до любого свойства можно доступиться черезKVCилиruntime
- Да.
- Что такое быстрое перечисление (
fast enumeration)?- Итерация (цикл) по коллекциям (
NSArray,NSDictionary):for Type *item in Collection {}
- Итерация (цикл) по коллекциям (
- Что такое
KVC? Когда его нужно использовать? - Что такое
designated initializer? - Как удалить объект в ходе итерации по циклу?
- Что такое
Run Loop? - Как лучше всего загрузить
UIImage c диска(с кеша)? - Какой контент лучше хранить в
Documents, а какой вCache? - Как связаны
NSRunLoop и NSAutoreleasePoolна пальцах? - Почему нам не следует вызывать
instance методы в методе initialize,? NSCoding, archiving- Протокол
NSCopying, почему мы не можем просто использовать любой собственный объект в качестве ключа в словарях (NSDictionary) , что нужно сделать чтобы решить эту проблему? (разница между глубоким и поверхностным копированием)