Почему нельзя использовать retainCount

Источники:

http://whentouseretaincount.com

http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/

Более того — для объектов-констант xCode возвращает разные значения, например, для [NSNumber numberWithInt:1] и @»Foo».

Краткое содержание:
1)retainCount может изменяться при пропускании объекта через какое-либо системное API
2)возвращаемое значение может зависеть от специфики объектов
3)retainCount не учитывает autoreleased объекты
4)autorelease связано с потоками, а retainCount — глобальная величина
5)retainCount может никогда не вернуть ноль
6)синглтоны (в том числе системные)
7)некоторые классы могут манипулировать retainCount самостоятельно, т.е.вам нельзя использовать method-swizzling
8)команды retain/release потокобезопасны, а возвращаемое retainCount значение может оказаться неактуальным

iOS. Разница между singleton для ARC и не-ARC

Источник:

https://github.com/IgorFedorchuk/objective-c-style-guide

Исходный код

#if __has_feature(objc_arc) // ARC Version

#define SYNTHESIZE_SINGLETON_FOR_CLASS(classname)	\
\
+ (classname *)sharedInstance\
{\
    static classname *shared##classname = nil;\
    static dispatch_once_t onceToken;\
    dispatch_once(&onceToken, ^{\
        shared##classname = [[self alloc] init];\
    });\
    return shared##classname;\
}

#else // Non-ARC Version

#define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \
static classname *shared##classname = nil; \
+ (classname *)sharedInstance \
{ \
    @synchronized(self) \
    { \
        if (shared##classname == nil) \
        { \
            shared##classname = [[self alloc] init]; \
        } \
    } \
    return shared##classname; \
} \
\
+ (id)allocWithZone:(NSZone *)zone \
{ \
@synchronized(self) \
{ \
if (shared##classname == nil) \
{ \
shared##classname = [super allocWithZone:zone]; \
return shared##classname; \
} \
} \
return nil; \
} \
- (id)copyWithZone:(NSZone *)zone \
{ \
return self; \
} \
- (id)retain \
{ \
return self; \
} \
- (NSUInteger)retainCount \
{ \
return NSUIntegerMax; \
} \
- (oneway void)release \
{ \
} \
- (id)autorelease \
{ \
return self; \
}

#endif

Разница:
1)dispatch_once
2)статическая переменная объявлена внутри функции/вне ее (возможно, не имеет значения)

Используем 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