Используем OCMock не по назначению.

OCMock — фреймворк, предназначенный для тестирования приложений:

http://ocmock.org/

Кроме unit-тестов его можно использовать не по назначению, как альтернативу method swizzling.
Можно:
- подменить метод существующего объекта;
- создать объект некоторого класса и подменить в нем метод.
Нельзя заменить метод в классе так, чтобы класс создавал объекты с измененным методом.

Core Data + MagicalRecord. Пример работы с несколькими контекстами

Сначала инициализируем MagicalRecord. Создаем дочерний контекст и записываем в него что-нибудь, сохраняем в БД (после этого изменяется и родительский контекст).
Читаем из главного контекста, проверяем, что внесенные в дочерний контекст изменения появились в главном контексте.
Удаляем записи из дочернего контекста и применяем изменения без сохранения в БД. Эти изменения должны проявиться и в родительском контексте, но если остановить приложение на этом месте и перезапустить, то изменения исчезнут.
Далее пробуем сохранить изменения и в родительском контексте и в БД. Если после этого приложение перезапустить, то внесенные изменения останутся.

    [MagicalRecord setupCoreDataStack];
    NSManagedObjectContext *parentContext = [NSManagedObjectContext MR_defaultContext];

        NSManagedObjectContext *moc = [NSManagedObjectContext MR_contextWithParent:parentContext];
        BCExchange *exc = [BCExchange MR_createInContext:moc];
        exc.identifier = @"111";
        exc.name = @"ddddd";
        [moc MR_saveToPersistentStoreAndWait];
    
    {
        NSArray *arr = [BCExchange MR_findAllInContext:parentContext];
        NSLog(@"%d", arr.count);
    }
    
    [BCExchange MR_truncateAllInContext:moc];
    [moc MR_saveOnlySelfAndWait];
    {
        NSArray *arr = [BCExchange MR_findAllInContext:parentContext];
        NSLog(@"%d", arr.count);
    }
    
    [moc MR_saveToPersistentStoreAndWait];
    {
        NSArray *arr = [BCExchange MR_findAllInContext:parentContext];
        NSLog(@"%d", arr.count);
    }

xCode. Сбросить параметры target

В проекте xCode при сборке проекта берутся параметры для target. Если такие не заданы, то берутся из настроек проекта, общих для всех targets. Соответственно любое изменеие опции в target перекроет общие настройки.

Для сброса настройки в исходное положение нужно выбрать необходимую строку и нажать delete.

Баг с UITableView в новом xCode

Добавляю простую таблицу с одной custom ячейкой на UIVIewController (в Storyboard), задаю делегаты, определяю required (обязательные) делегатные методы, добавляю autolayout constraints. Получаю:
Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell’s content view. We’re considering the collapse unintentional and using standard height instead.

Решение:
Необходимо дописать метод (tableView:heightForRowAtIndexPath:) делегата UITableViewDataSource. Без этого метода приложение не вылетает, но не может корректно определить высоту ячейки.

Неявное преобразование типов в Swift (implicit conversion)

Основная проблема Swift — это почти полное отсутствие неявного (implicit) приведения типов. Вы не сможете даже сложить 2 и 2.5 — целочисленное нужно будет привести к типу Double явно.

Также существует обходной путь — заставить приложение произвести действия над двумя числами (или объектами) через перегрузку операторов. Пример:

xCode. Size Classes

Оригинал — документация и презентации на сайте Apple.
Перевод:

http://habrahabr.ru/post/235181/

Суть технологии — облегчить программисту работу с экранами с разными разрешениями.

Для того, чтобы научиться пользоваться, не обязательно копировать все действия, описанные в данной статье.
Вместо этого попробуйте выложить 3 UIView’s в ряд и добиться того, чтобы левый прилегал к левому и верхнему краю, центральный — к центру и верхнему краю, правый — к правому и верхнему краю. При этом пусть они остаются квадратные и с какими-нибудь отступами между собой — на всех разновидностях устройств.

P.S. Важно помнить, что даже эта технология покрывает только всевозможные «физические» разрешения экранов и только частично учитывает (если учитывает вообще) «виртуальные» разрешения. Например, всевозможные экраны для iphone:

http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions

Программирование Auto Layout

Источник:

http://osxdev.ru/blog/ios/79.html

Рассказывает про создание constraints кодом без использования их собственного декларативного языка.
Возможный вариант применения — одни и те же constraints на нескольких view, constraints для view, добавляемых динамически и т.д.

xCode. DBSmartPanels — незаменимо для небольших экранов ноутбуков

DBSmartPanels позволяет автоматически прятать нижние и правые панели xCode, кода они не нужны. Например, при редактировании кода не требуются панель инструментов дизайна.

Настроить дополнительные опции можно через меню Xcode >> Smart Panels…

Установка:
1)скачать репозиторий git;
2)запустить скачанный проект;
3)перезапустить xCode.

Исходники на GitHub

NSArray of selectors

Селекторы не являются объектами, поэтому их нельзя напрямую сохранять в массив. Более того не существует литерала, упрощающего преобразование селектора к объекту. Следующая функция должна помочь:

+ (NSArray *)arrayWithSelectors:(SEL)selector1, ... {
    
    NSMutableArray *arr = [NSMutableArray array];
    SEL eachObject;
    va_list argumentList;
    if (selector1) {
        
        [arr addObject:NSStringFromSelector(selector1)];
        va_start(argumentList, selector1);
        while ((eachObject = va_arg(argumentList, SEL))) {
            
            [arr addObject:NSStringFromSelector(eachObject)];
        }
        va_end(argumentList);
    }
    return arr;
}

Core Data. MagicalRecord

Core Data поддерживает многопоточность, но для этого нужно много дополнительных действий. MagicalRecord является надстройкой над Core Data и упрощает этот процесс, а также предоставляет дополнительные методы для более простого доступа к БД.

Пример записи в БД (лучше вызывать в главном потоке):

- (void)updateEntititesNamed:(NSString *)name filler:(id)filler fillSelector:(SEL)fillSelector fillParams:(NSArray *)fillParams {

Class cl = NSClassFromString(name);
[cl MR_truncateAll];
for (NSDictionary *dict in fillParams) {

NSManagedObject *obj = [cl MR_findFirstOrCreateByAttribute:BKKeyIdentifier withValue:dict[BKKeyIdentifier]];
objc_msgSend(filler, fillSelector, obj, dict);
}

[[NSManagedObjectContext MR_defaultContext] MR_saveWithOptions:MRSaveSynchronously | MRSaveParentContexts completion:^(BOOL success, NSError *error) {

if (success) {

LOG(@"You successfully saved your context.");
} else if (error) {

LOG(@"Error saving context: %@", error.description);
} else {

LOG(@"UNHANDLED ERROR!!!!!!!!!!!");
}
}

Примеры чтения из БД:

[BKTradePair MR_findAllSortedBy:@"identifier" ascending:YES];
- (BKTradePair *)getForId1:(NSString *)fromID id2:(NSString *)toID {

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id1 = %@ && id2 = %@", fromID, toID];
return [BKTradePair MR_findFirstWithPredicate:predicate];
}

ВАЖНО: лучше не пытаться хранить объекты NSManagedObject, а регулярно запрашивать их из БД или хранить их id. Главный контекст доступен только в главном потоке, а эти объекты неизвестно, в каком потоке они были созданы и, соответственно, в каком контексте (NSManagedObjectContext).
Например, если получаете все записи асинхронно и не указываете конкретный контекст, то используется вспомогательный контекст, который autorelease. Полученные через него NSManagedObject’ы существуют дольше, чем если бы они были просто autoreleased NSObject и становятся nil в конце. Происходить это может в случайные моменты времени и приводит к ошибкам в случайных местах.