Skip to content

Instantly share code, notes, and snippets.

@NSSimpleApps
Last active April 7, 2022 16:36
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NSSimpleApps/2468d102495a049e81ad to your computer and use it in GitHub Desktop.
Save NSSimpleApps/2468d102495a049e81ad to your computer and use it in GitHub Desktop.

======= General:

  • Что такое полиморфизм?

    • Полиморфизм - это одно из главных составляющих ООП. Полиморфизм даёт возможность объектам с одинаковым интерфейсом иметь различную реализацию и позволяет использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Реализация может быть изменена в процессе наследования. Это позволяет создавать абстрактные программы и повторно использовать код.
  • Что такое инкапсуляция? Что такое нарушение инкапсуляции?

    • Инкапсуляция - это сокрытие реализации и внутренней структуры класса, а также ограничение доступа к внутренней структуре. Нарушение инкапсуляции - это раскрытие внутренней реализации класса, а также использование полей класса в обход диспетчеризации (геттеры, сеттеры).
  • Чем абстрактный класс отличается от интерфейса?

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

  • Опишите основные понятия ООП в терминах 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.
  • Цепочка ответсвенности, что происходит с методом после того как он не нашелся в объекте класса, которому его вызвали (в сторону forwardInvocation:)?

  • Чем категория отличается от расширения (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) , что нужно сделать чтобы решить эту проблему? (разница между глубоким и поверхностным копированием)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment