Полезные факты о языке программирования Objective-C

в 8:48, , рубрики: Cocoa, objective-c, интересные факты, разработка под iOS, метки: , ,

Я уже 2 года занимаюсь разработкой приложений под iOS и в этой статье мне захотелось представить те факты, которые показались мне интересными и полезными. Буду рад, если вы так же поделитесь своими знаниями в комментариях. В следующей статье хотелось бы собрать подобные факты о Foundation Kit.

.m

Разрешение .m (message) ввели для того чтобы выделить ключевую особенность Objective-С. По сути, мы не вызываем методы у класса, мы отправляем сообщение объекту, после чего происходит диспетчеризация в ходе которой диспетчер методов Objective-C ищет нужный класс и вызывает у него необходимый метод.

NS

Префикс NS обозначает Next Step. Он возник еще в те времена, когда не было Cocoa, а фрейворк назывался NextSTEP и был продуктом NeXT Software. Apple купила эту компанию в 1996 году и чтобы не нарушать обратную совместимость кода продолжила использовать этот префикс.

#include & #import

В Си используют include guard во избежании рекурсивного включения заголовочных файлов.
В Objective-C эта функция встроена в #import.

BOOL

BOOL в Objective-C в действительности представляет собой typedef для signed char, который использует 8 бит памяти. YES определено как 1, а NO – как 0 с применением директивы #define.
Objective-C не рассматривает BOOL как истинно логический тип, который в состоянии принимать только два значения — YES и NO. Компилятор рассматривает BOOL как 8-битовое число, а значение YES и NO представляют собой всего лишь соглашения. Это приводит к трудноуловимым ошибкам: если вы будете недостаточно внимательны и присвоите переменной типа BOOL значение более одного байта, такое как short или int, то для логического значения будет использован только младший его байт. Если этот байт случайно окажется нулевым (например в случае 8960 (шестнадцатеричное значение 0x2300)), то значение BOOL тоже будет нулевым, т. е. значение NO. По этой причине не стоит ни когда сравнивать значение типа BOOL непосредственно с YES.

-(void)myMethod

Ведущее тире указывает, что это объявление метода Objective-C. Это тире предназначено для того чтобы отличить объявление метода от прототипа функции.

isa

Класс NSObject объявляет одну переменную экземпляра isa для того чтобы в ней хранить указатель на класс объекта. Переменная носит такое имя, поскольку она фактически определяет отношение “is a” (является) между подклассом и надклассом, т.е. Rectangle является Shape, и Circle является Shape.

База плюс смещение

При работе компилятор использует механизм «база плюс смещение». Имея базовый адрес объекта – т.е. место расположения в памяти первого байта первой переменной экземпляра – компилятор может найти все остальные переменные экземпляра, добавляя к данному базовому адресу определенные смещения.

Эта проблема решена в новой 64-битной системе времени выполнения Objective-C, где для определения местоположения переменных экземпляра используется косвенность.

set & get

Все знают что префикс set используется для методов установки или сеттеров. Но почему мы не используем get для геттеров? Слово get в Cocoa имеет особый смысл: в имени метода Cocoa оно обозначает, что метод возвращает значение посредством указателя, переданного в качестве параметра. Например, NSData имеет метод getBytes:.

@ class

Импорт заголовочного файла устанавливает строгую зависимость между заголовочным файлом и импортирующим его файлом с исходным текстом. Если заголовочный файл изменяется, то все файлы, зависящие от него, требуют перекомпиляции. Иногда это требует большое количества времени. Objective-C дает нам возможность минимизировать перекомпиляцию вызванную зависимостями. Вопросы зависимостей появляются из-за того, что компилятор Objective-C для успешной работы нуждается в определенной информации. Временами ему требуется полная информация о классе, такая как схема размещения переменных экземпляра и цепочка его наследования, а иногда достаточно только имени класса без его полного определения.
Ключевое слово @class является опережающей ссылкой (forward reference). Это способ сказать компилятору «доверься мне; ты знаешь что это такой класс есть, а больше тебе пока знать и не надо».

Информация взята из книги «Objective-C 2.0 и программирование для Mac» Марк Далримпл, Скотт Кнастер.

Автор: danilNik

Источник

Поделиться

* - обязательные к заполнению поля