Показаны сообщения с ярлыком Objective-C. Показать все сообщения
Показаны сообщения с ярлыком Objective-C. Показать все сообщения

Комментарии для документирования кода Objective-C

В настройках Xcode есть такие интересные вещи как Documentation Markup и Documentation Markup Keywords.
Из этого следует, что Xcode поддерживает комментарии для описания кода.

Я советую для Documentation Markup Keywords выбрать более темный оттенок чтобы можно было различать ключевые слова в комментариях документирующих код.

Разбираемся с NSDate

UTC — это всемирное координированное время, стандарт времени, принятый на Земле. От UTC отсчитываются часовые пояса. UTC заменил устаревшее время по Гринвичу (GMT). UTC расшифровывается как Coordinated Universal Time (по-английски).


Comparing to NSNull

Checks to NSNull come up a lot when dealing with things like parsing JSON and while it’s mostly just ==, there are some options.
The officially sanctioned method is NSNull sample code, but this will generate a warning in clang (BOOO HISSSS).

Registering for Key-Value Observing

In order to receive key-value observing notifications for a property, three things are required:
  • The observed class must be key-value observing compliant for the property that you wish to observe.
  • You must register the observing object with the observed object, using the method addObserver:forKeyPath:options:context:.
  • The observing class must implement observeValueForKeyPath:ofObject:change:context:.


Варианты многопоточности в iOS

Каждое iOS приложение состоит из одного или более потока. Каждое приложение начинается с одного потока и, затем может создавать еще дополнительные потоки.
Когда приложение создает дополнительный поток, он становится отдельной сущностью в пространстве процесса приложения. Каждый поток имеет свой стек и планируется на исполнение отдельно kernel’ом. Поток может общаться с другими потоками. Все потоки находятся в общем адресном пространстве приложения и делят одну и ту же виртуальную память и имеют те же права доступа что и процесс приложения.
Главный поток приложения имеет существенные отличия от остальных  по своему фнукционалу. Он выполняет функцию main приложения и отвечает за обработку событий от пользователя и обновление UI.
Поэтому, если, скажем нам нужно сделать чтото асинхронное или объемное, то желательно это сделать не в основном потоке. Если это делать на главном потоке – приложение перестанет реагировать на пользователя и с большой долей вероятности будет закрыто.

Многопоточность в iOS. Введение в GCD, часть 4, семафоры

Очередная статья о GCD. На этот раз познакомимся с семафорами, механизм которых предлагает нам GCD. Семафор позволяет выполнять какой-либо участок кода одновременно только конкретному количеству потоков. В основе семафора лежит счетчик, который и определяет, можно ли выполнять участок кода текущему потоку или нет. Если счетчик больше нуля — поток выполняет код, в противном случае — нет.
На семафоре определены три операции:
  • Создание семафора
  • Подождать, пока счетчик семафора станет больше нуля, уменьшить его на единицу и пройти далее
  • Увеличить счетчик на единицу

Многопоточность в iOS. Введение в GCD, часть 3

В первой части мы узнали, что для выполнения задач существуют очереди. Узнали какие виды очередей существуют и как из создавать. В третьей части мы познакомимся с полезными функциями для управления очередями задач.
Вспомним, что очередь создается вот так:
dispatch_queue_t queue = dispatch_queue_create("com.myapp.myqueue", DISPATCH_QUEUE_CONCURRENT);
Далее мы будем использовать переменную queue, подразумевая что очередь у нас создана.

Многопоточность в iOS. Введение в GCD, часть 2

В прошлой статье мы познакомились с очередями выполнения задач и с некоторыми функциями, которые позволяют запускать задачи на выполнение. В этой статье мы рассмотрим еще несколько функций, которые запускают задачи на выполнение.

Многопоточность в iOS. Введение в GCD

GCD или Grand Central Dispatch — механизм распаралеливания задач, представленный в iOS 4 и Mac OS X 10.6. Суть механизма в том, что реализация многопоточности скрывается от программиста. Всю «заботу» о создании потоков берет на себя GCD. Утверждается, что задачи GCD легковесны и требуют меньше процессорного времени, чем создание потоков. Получается, что все что требуется от программиста — определить какие задачи выполнять и поставить в нужную очередь, а GCD уже разберется со всем остальным.

Как работает @synchronized в Objective-C

Язык Objective-C поддерживает синхронизацию для многопоточных приложений. При помощи директивы @synchronized () можно защитить фрагмент кода от одновременного выполнения сразу несколькими потоками.
@synchronized () берёт на вход указатель на объект языка Objective-C (можно использовать для этой цели любой объект, в том числе и self), который играет роль мьютекса (mutex).
При попытке потока начать выполнение защищенного фрагмента проверяется, выполняется ли уже этот фрагмент каким-либо потоком. Если да, то сравниваются объекты, переданные этими потоками в @synchronized ().
Если эти указатели совпадают, то поток, пытающийся войти в защищенный блок, будет приостановлен (suspended) до тех пор, пока первый поток не выйдет из блока. Тогда выполнение второго потока продолжится, и уже он «запрёт» этот блок для всех остальных потоков.
Наличие подобной возможности заметно облегчает жизнь при написании многопоточных приложений, когда необходимо отслеживать попытки одновременного изменения одних и тех же данных сразу несколькими потоками.
- (void) criticalMethod
{
    @synchronized ( self )
    {
         // perform modifications to shared objects
         . . .
    }
}
В качестве мьютекса (т. е. параметра инструкции @synchronized) рекомендуется указывать объект, недоступный извне, поскольку это может привести к взаимной блокировке, если один и тот же объект используется в качестве мьютекса двумя взаимозависимыми потоками. В частности, не рекомендуется @synchronized(self).

Как сделать статический анализ кода в Xcode-проекте с помощью OCLint

Для начала нужно установить OCLint с помощью Homebrew.

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew install https://gist.githubusercontent.com/TonyAnhTran/e1522b93853c5a456b74/raw/157549c7a77261e906fb88bc5606afd8bd727a73/oclint.rb

Далее нужно настроить .bash_profile.
$ cd ~
$ touch .bash_profile
$ open -e .bash_profile

В .bash_profile нужно добавить следующее:
OCLINT_HOME=/usr/local/Cellar/oclint/0.8.1
export PATH=$OCLINT_HOME/bin:$PATH

$ . .bash_profile

Подробнее об установке можно почитать тут:

OCLint можно использовать из командной строки:

Как на Objective-C выполнить код для определенной версии OS X

+ (void)executeCodeForOSVersion:(void (^)(SInt32 aMajor, SInt32 aMinor, SInt32 aBugFix))aCodeBlockName
{
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
    SInt32 theMajor, theMinor, theBugFix;
    Gestalt(gestaltSystemVersionMajor, &theMajor);
    Gestalt(gestaltSystemVersionMinor, &theMinor);
    Gestalt(gestaltSystemVersionBugFix, &theBugFix);
#pragma GCC diagnostic pop
    
    aCodeBlockName(theMajor, theMinor, theBugFix);
}

Дайджест по саморазвитию в программировании №17

Dependency Injection · objc.io
Внедрение зависимости — Википедия
Dependency Injection в Objective-C с Магией и Кровью / Хабрахабр
Singletons in Objective-C - Matt Galloway

Double Click and NSCollectionView
End editing in an NSTextField
Working with Cocoa File Packages
Многопоточность в iOS. Введение в GCD
KVC Collection Operators - NSHipster

ios - How to call JavaScript Function in objective C - Stack Overflow
JavaScriptCore by Example | Big Nerd Ranch
Связь Objective-C и JavaScript
Taming JavascriptCore within and without WebView
Crossing the WebKit bridge

Современный учебник JavaScript
Как я научился любить скучные мелочи CSS
CSS background Property

Red's Toyland - Python and Objective C
Embedding Python in Objective-C: Part 2
Introduction — PyObjC — the Python ⟷ Objective-C bridge

Как пчёлы познали теорему Пифагора, а муравьи — абсолютный и относительный счёт - Научный блог

Микросервисы (Microservices) / Хабрахабр
Типичный программист – Сначала — монолит, или правильный путь к микросервисной архитектуре

Как объяснить что такое биткоин пятилетнему ребёнку
Майнинг и как он работает: матчасть / Хабрахабр

Objective-C FAQ – часто задаваемые вопросы по Objective-C

Как использовать селектор в Objective-C?

О том что такое селектор можно почитать в официальном руководстве.

В примере ниже из метода test вызывается метод printString:, которому передаётся строка в качестве аргумента:

- (void)test
{
    SEL theMyMethod = @selector(printString:);
    
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [self performSelector:theMyMethod withObject:@"Здравствуй, мир!"];
#pragma clang diagnostic pop
}

- (void)printString:(NSString *)aString
{
    NSLog(@"%@", aString);
}

Если убрать -Warc-performSelector-leaks, то будет появляться предупреждение "PerformSelector may cause a leak because its selector is unknown".

Селекторы можно использовать для реализации лямбда методов.