-
Что такое полиморфизм?
- Полиморфизм - это одно из главных составляющих ООП. Полиморфизм даёт возможность объектам с одинаковым интерфейсом иметь различную реализацию и позволяет использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Реализация может быть изменена в процессе наследования. Это позволяет создавать абстрактные программы и повторно использовать код.
-
Что такое инкапсуляция? Что такое нарушение инкапсуляции?
- Инкапсуляция - это сокрытие реализации и внутренней структуры класса, а также ограничение доступа к внутренней структуре. Нарушение инкапсуляции - это раскрытие внутренней реализации класса, а также использование полей класса в обход диспетчеризации (геттеры, сеттеры).
-
Чем абстрактный класс отличается от интерфейса?
- Абстрактный класс - может иметь поля, методы, но имеет хотя бы один абстрактный (не определенный) метод. Интерфейс - чистый абстрактный класс, в котором не может быть свойств и не опередены методы. От абстрактного класса наследуются и реализуют абстрактный метод. Интерфейс реализуют или полностью, или частично (тогда это будет новый абстрактный класс).
-
Расскажите о паттерне
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) , что нужно сделать чтобы решить эту проблему? (разница между глубоким и поверхностным копированием)