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 в конце. Происходить это может в случайные моменты времени и приводит к ошибкам в случайных местах.

iOS. Когда объекты UIViewController требуются в разных ориентациях в одном приложении

Например, если все приложение в ориентации portrait, а при клике на графике «разворачивается» на весь экран в landscape.

Источник решения:

http://stackoverflow.com/questions/24970286/differnet-orientations-for-various-view-controllers/24970381#24970381

Возможно единственное универсальное решение — использовать афинные преобразования:

-(void)setRotationInLandscapeMode:(BOOL)status
{
if(status)
{
self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -20.0);
self.view.transform = CGAffineTransformMakeRotation((M_PI * (90) / 180.0));
self.view.frame = CGRectMake(0,0, 320,568 );
}
else
{
self.view.transform = CGAffineTransformMakeRotation((0));
self.view.frame = CGRectMake(0,0, 320,568 );
}
}

Здесь приведено вместе с кодом, возвращающим view в исходное положение.
Далее вызываем этот код при отображении view:

-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];
[self setRotationInLandscapeMode:YES];
}

В данном коде можно брать не конкретное значение прямоугольника, а из существующего view напрямую или вычислять на основе его.

На симуляторе не работает строка:

[[UIApplication sharedApplication] setStatusBarHidden:status];

Возможно, лишняя, или правильно отображаться будет только на устройстве. Или зависит от структуры проекта.

Также не работают supportedInterfaceOrientations и подобные методы. Внутри UIViewController они просто не работают. Внутри UINavigationController они работают, но только только один раз при его создании/отображении, т.е. можно задать ориентацию только для всех UIVIewControllers внутри него единоразово и нельзя выставлять какие-либо настройки для отдельного UIViewController.

iOS. Формат даты в зависимости от региональных настроек телефона

Иногда требуется, чтобы приложение показывало не просто дату в определенном формате, а дату в зависимости от выбранной в глобальных настройках страны/региона.

Решение есть:

http://stackoverflow.com/questions/7941789/format-date-and-time-after-device-current-region-settings

Позволяет избавиться например от проблемы выбора того, что писать сначала число, потом месяц или наоборот

Gamemaker Studio. Использование нового отладчика

В Studio 1.3 появился компиллятор с breakpoints.yoyo degugger

Будет полезным при отладке сложных алгоритмов. Горячие клавиши — F5 продолжить, F9 установить breakpoint, F10, F11 — пошаговая отладка. Есть окошко слежения за переменными проекта.

В настоящее время все еще сырой. Например, установленную точку breakpoint очень сложно убрать.

Новое в iOS 7/7.1

ios 7

Эта статья является переводом раздела официальной документации apple. Источники:

https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS7.html

https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS7_1.html#//apple_ref/doc/uid/TP40013916-SW1

Из нововведений стоит отметить следующее:

- расширенная поддержка внешних устройств;

- тайлы карт Apple теперь можно изменять;

- поддержка 64-разрядной архитектуры и т.д.

Читать далее

C++. Использование *.dll без вспомогательных файлов.

visual studio 2013
Пример здесь:

http://goffconcepts.com/techarticles/calldll.html

В Visual Studio создаем проект c++ dll, компилируем. В проекте, в котором планируется использовать библиотеку: через контекстное меню добавляем ссылку на dll, добавляем часть кода по ссылке выше.

При необходимости можно в открытое «решение» (solution) добавить новый пустой проект и в нем создать main функцию. Это может потребоваться при отладке dll.

Gamemaker Studio. Использование внешних библиотек dll.

Тема с ответами на вопрос на официальном форуме:

http://gmc.yoyogames.com/index.php?showtopic=614647

Наиболее полное руководство:

http://gmc.yoyogames.com/index.php?showtopic=405812

Создать пустой C++ проект, добавить main.cpp, собрать библиотеку. Пример содержания main.cpp:

#include
#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT double Multiply(double a, double b) {
return a * b;
}

DLLEXPORT double MsgBox(char* caption, char* message) {
MessageBox(0, message, caption, MB_OK);
return 0;
}

DLLEXPORT double ProcCount() {
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
return sysinfo.dwNumberOfProcessors;
}

Сгенерированную таким образом библиотеку нужно перетянуть в окно Gamemaker Studio в папку Included Files.

Более того, можно в Visual Studio настроить экспорт скомпилированных файлов в папку для included. Тогда новые измененная библиотека будет подхватываться автоматически.

Не удалось настроить проект для тестирования библиотеки в Visual Studio. Ругается на объявления char *. При этом GM: Studio воспринимает эту библиотеку нормально.

SmartGit+GitHub. Инструкция

smartgit
Ссылка на первоисточник:

http://derekreynolds.wordpress.com/2011/01/18/how-to-set-up-smartgit-with-github/

Коротко по пунктам:
- установить и запустить git (для windows есть standalone инсталлятор)
- через меню «Программы» найти установленный Git GUI сгенерировать SSH ключ и подключить к аакаунту
- установить SmartGit и забрать нужный проект с GitHub.

ВАЖНО! Вводить нужно не тот адрес, который предлагает GitHub, а адрес вида:
git@github.com:myn/warm-z-twopointtwo-base.git

где «git@github.com:» — общая часть для всех проектов на github.com, дальше идет относительный адрес репозитория.

Либо можно переключить внешний вид адреса в GitHub справа страницы (через ссылки во фразе «You can clone with HTTPS, SSH, or Subversion. «).

Стандартная http авторизация (с примерами)

На сервере авторизацию обычно реализуют своим способом — определяют свои параметры, передаваемые в запросе.
Существуюет другой, более общий способ — через установки значения заголовка «Authorization». Примеры:

C#:

HttpWebRequest webRequest = ...;
webRequest.Credentials = new NetworkCredential(User, Password);

GameMaker Studio (GML):

var auth_base64 = "Basic " + base64_encode(username + ":" + password);
var headers = ds_map_create();
ds_map_add(headers, "Host", host);
ds_map_add(headers, "Authorization", auth_base64);
ds_map_add(headers, "Content-Type", "application/json-rpc");
ah_auth = http_request(protocol + "://" + host + target, 'POST', headers, body);
ds_map_destroy(headers);

Objective-C:

NSString *auth_base = ...; //получение аналогично способу для GML
NSMutableURLRequest *request = ...;
[request setValue:auth_base forHTTPHeaderField:@"Authorization"];

В Objective-C также есть класс NSURLCredential. Не проверен, единственный найденный способ с его использованием — через NSURLConnectionDelegate.