objective c для чего
Objective-C
Всё программирование для iPhone и Cocoa MacOS X ведётся с помощью языка Objective-C.
Objective-C создан в давних 80-ых Брэдом Коксом и Томом Лав. Objective-C является надстройкой надо языком С и даёт возможность писать обычный С-код. Objective-C привносит объектно-ориентированные возможности, которые заимствует у Smalltalk. Первоначально концепции и терминология Objective-C вызывает некоторое замешательство. Но тут дело привычки и после недолгой работы, странный синтаксис уже не выглядит так непривычно.
Итак, Objective-C — это объектно-ориентированный язык, что значит полную поддержку объектов, членов-данных, методов, инкапсуляции, наследования и полиморфизма и всего что с этим связано. Заголовочный файл (.h) и файл реализации (.m) — вместе представляют собой объект в терминах Objective-C. В какой-то момент времени вы будете использовать встроенные объекты, которые поставляются с framework iPhone OS, но гораздо чаще вам придётся разрабатывать новые классы или наследоваться от уже существующих, чтобы добавить новое поведение. Когда будете это делать, вам необходимо будет добавить новую пару файлов (.h) и (.m), которые будут представлять ваш новый класс.
Рассмотрим шесть основных синтаксических элементов языка Objective-C:
Message — сообщение
Сообщение посылается, когда один объект просит дугой выполнить определённое действие. Говоря привычным нам языком — послать сообщение, значит выполнить вызов функции/метода. Вызов простого сообщения выглядит следующим образом:
Язык программирования Objective-C
Язык был придуман Брэдом Коксом (Brad Cox) в начале 80-х годов прошлого века. Целью Кокса было создание языка, поддерживающего концепцию software IC. Под этой концепцией понимается возможность собирать программы из готовых компонент (объектов), подобно тому как сложные электронные устройства могут быть легко собраны из набора готовых интегральных микросхем (IC, integrated curcuits).
При этом такой язык должен быть достаточно простым и основанным на языке С, чтобы облегчить переход разработчиков на него.
Одной из целей было также создание модели, в которой сами классы также являются полноценными объектами, поддерживалась бы интроспекция и динамическая обработка сообщений.
Привязка сообщения к соответствующей функции происходит непосредственно на этапе выполнения.
В языке есть нормальная поддержка протоколов (т.е. понятие интерфейса объекта и протокола четко разделены). Для объектов поддерживается наследование (не множественное), для протоколов поддерживается множественное наследование. Объект может быть унаследован от другого объекта и сразу нескольких протоколов (хотя это скорее не наследование протокола, а его поддержка).
На данный момент язык Objective-C поддерживается компилятором gcc (соответственно для форточек он поддерживается mingw и cygwin). Судя по заявлениям в новой версии Mac OS X 10.5 будет кроме gcc (используемого для всех предыдущих версий) еще и компилятор от Intel’а. Также по слухам в этой версии операционной системы будет использован Objective-C 2, куда в частности войдет поддержка сборки мусора (garbage collection)/
Довольно много в языке перенесено на runtime-библиотеку и сильно зависит от нее. Вместе с компилятором gcc поставляется минимальный вариант такой библиотеки. Также можно свободно скачать runtime-библиотеку от компании Apple: Apple’s Objective-C runtime.
Эти две runtime-библиотеки довольно похожи (в основном отличие заключается в именах методов), хотя далее я буду ориентироваться на runtime-библиотеку от компании Apple.
Синтаксис языка
В языке Objective-C для обозначения объектов используется специальный тип id (да, именно то самое id, стоящее в названии idSoftware). Переменная типа id фактически является указателем на произвольный объект. Для обозначения нулевого указателя на объект используется константа nil.
Тем самым язык поддерживает проверку типов, но в нестрогой форме (т.е. найденные несоответствия возвращаются как предупреждения, а не ошибки).
Для посылки сообщений используется следующий синтаксис:
В отличии от языка С++ посылка сообщения nil‘у является законной операцией, всегда возвращающей нулевое значение (nil).
Сообщение может также содержать параметры:
Язык Objective-C позволяет снабжать метками каждый аргумент, что заметно повышает читаемость кода и снижает вероятность передачи неправильного параметра.
В этом примере в качестве имени сообщения выступает setWidth:height:.
Также поддерживается возможность передачи произвольного количества аргументов в сообщении:
Как и функции, сообщения могут возвращать значения, при этом в отличии от языка С, типом возвращаемым по умолчанию значения является id.
Результат одного сообщения можно сразу же использовать в другом сообщении:
Как уже говорилось, в Objective-C классы сами являются объектами. Основной задачей таких объектов (называемых class objects) является создание экземпляров данного класса (это очень похоже на паттерн Abstract Factory).
В языке Objective-C нет встроенного типа для булевский величин, поэтому обычно такой тип вводится искусственно. Далее я буду для логических величин использовать тип BOOL с возможными значениями YES и NO (как это делается в операционных системах NextStep, Mac OS X).
Первым достаточно серьезным применением языка Objective-C было его использование в операционной системе NextStep. Для этой системы было написано большое количество различных классов на Objective-C, многие из которых до сих пор используются в Mac OS X.
Имена всех этих классов начинаются с префикса NS, обозначающего свою принадлежность к операционной системе NextStep.
Компилятор поддерживает данный тип, автоматически переводя конструкции вида @»my string» в указатель на объект класса NSString, содержащий данную строку (точнее его подкласса, соответствующего константным строкам).
Создание новых классов
Все новые директивы компилятору в языке Objective-C начинаются с символа @.
Ниже приводится общая структура описания нового класса:
Описание переменных ничем не отличается от описания переменных в структурах в языке С:
Описания же методов заметно отличаются от принятых в С++ и очень сильно похожи на описания методов в языке Smalltalk.
Каждое описание начинается со знака плюс или минус. Знак плюс обозначает, что данный метод является методом класса (т.е. его можно посылать только class object‘у, а не экземплярам данного класса). Фактически методы класса являются аналогами статических методов в классах в языке С++.
Ниже приводятся описания возможных методов для класса Rect.
Обратите внимание, что имя метода может совпадать с именем instance-переменной данного класса (например, width и heigh).
Тип возвращаемого методом значения указывается в круглых скобках сразу же после знака плюс или минус (но перед названием метода). Если тип не указан, то считается, что возвращается значение типа id.
Далее идет имя метода, где после каждого двоеточия задается тип аргумента (в круглых скобках) и сам аргумент.
Метод, принимающий произвольное количество параметров, может быть описан следующим образом:
Для подключения заголовочного файла в Objective-C вместо директивы #include используется директива #import, полностью аналогичная #include, но гарантирующая что данных файл будет подключен всего один раз.
В ряде случаев возникает необходимость в объявлении того, что данное имя является именем класса, но без явного его описания (такая необходимость возникает при описании двух классов, каждый из которых ссылается на другой класс).
В этом случае можно воспользоваться директивой @class, объявляющей, что следующие за ней имена являются именами классов.
Реализация методов класса выглядит следующим образом:
Ниже приводится пример реализации методов класса Rect, описанного выше.
Как видно из примера выше, в методах доступны все instance-переменные. Однако, как и в С++, есть возможность управлять видимостью переменных (видимостью методов управлять нельзя) при помощи директив @private, @protected и @public (действующих полностью аналогично языку С++).
Как работает механизм сообщений
Компилятор переводит каждую посылку сообщения, т.е. конструкцию вида [object msg] в вызов функции objc_msgSend.
Эта функция в качестве своего первого параметра принимает указатель на объект-получатель сообщения, в качестве второго параметра выступает т.н. селектор, служащий для идентификации посылаемого сообщения. Если в сообщении присутствуют аргументы, то они также передаются objc_msgSend как третий, четвертый и т.д. параметры.
Каждый class object обязательно содержит в себе указатель на class object для родительского класса (superclass) и dispatch table. Последняя представляет из себя словарь, сопоставляющий селекторам сообщений фактические адреса реализующих их методов (функций).
Т.о. функция objc_msgSend ищет метод с данным селектором в dispatch table для данного объекта. Если его там нет, то поиск продолжается в dispatch table для его родительского класса и т.д.
Рис 1. Диаграмма для классов (со следующим порядком наследования Rectangle:Shape:NSObject)
Если метод (т.е. соответствующая ему функция) находится, то осуществляется его вызов с передачей всех необходимых аргументов.
Если объект поддерживает forwardInvocation:, то он может либо сам обработать посылаемое сообщение, либо переслать другому объекту для обработки:
Для ускорения поиска сообщений по dispatch table используется кэширование, позволяющее заметно снизить затраты на пересылку сообщений. Стоит заметить, что язык Objective-C активно применялся для построения пользовательского интерфейса и библиотеки классов для операционной системы NextStep, в то время когда эта система работа на компьютерах с 25-Мгц процессорами Motorol 68030.
Если даже на таком процессоре язык обеспечивал приемлемое быстродействие, то сейчас о нем можно практически не думать.
Для облегчения поиска метода по таблицам в Objective-C вместо имен методов используются так называемые селекторы. Обычно селектор представляет собой 32-битовую величину, позволяющую однозначно идентифицировать метод.
Тип селектора обозначается как SEL и существует ряд функций и конструкций, позволяющих осуществлять преобразование имени в селектор и обратно.
Так для получения селектора сообщения непосредственно по имени служит конструкция @selector():
Для получения селектора по строке символов (на этапе выполнения) и перевода селектора в строку служат функции NSSelectorFromString и NSStringFromSelector:
Мощная поддержка метаинформации в Objective-C позволяет прямо на этапе выполнения проверить поддерживает ли объект метод с данным селектором при помощи посылки ему сообщения respondsToSelector::
Довольно легко можно послать сообщение, соответствующее данному селектору (без аргументов, с одним, двумя или тремя аргументами) при помощи метода performSelector:, performSelector:withObject:, performSelector:withObject:withObject: и performSelector::withObject:withObject::withObject:.
Обратите внимание, что методы performSelector: всегда возвращают значение типа id.
Можно получить класс для данного объекта, послав ему сообщение class. Это сообщение возвращает класс в виде указателя на объект типа Class.
С другой стороны также можно легко получить соответствующий class object по имени класса:
Аргумент self может использоваться для посылки сообщений самому себе, как например в следующем методе:
Рис. 2. Разница при посылке сообщения self и super (для объекта класса Rectangle).
Таким образом, посылая сообщения super мы тем самым вызываем старые версии методов, переопределенные данным классом.
Послав объекту сообщение methodForSelector: мы получаем в ответ адрес реализующей этот метод функции.
Это позволяет при необходимости многократного вызова одного и того же метода у заданного объекта полностью избежать всех расходов, связанных с пересылкой сообщений.
Протоколы
Язык Objective-C содержит полноценную поддержку протоколов. Протокол представляет из себя просто список описаний методов. Объект реализует протокол, если он содержит реализации всех методов, описанных в протоколе.
Протоколы удобны тем, что позволяют выделять общие черты у разнородных объектов и передавать информацию об объектах заранее неизвестных классов.
Простейшее описание протокола выглядит следующим образом:
Так протокол Serializable может быть описан следующим образом:
Протокол может быть унаследован от произвольного количества других протоколов:
Точно также можно при описании класса задать не только родительский класс, но и набор протоколов:
Для проверки во время выполнения программы поддерживается ли объектом заданный протокол объектов можно использовать сообщение conformsToProtocol::
Кроме того имя протокола (протоколов) можно использовать при описании переменных для явного указания компилятору о поддержке соответствующими объектами протокола (протоколов).
Так если переменная myObject содержит указатель на объект заранее неизвестного класса, но при этом удовлетворяющий протоколам Serializable и Drawable, то ее можно описать следующим образом:
Точно также, если заранее известно, что myObject будет содержать указатель на объект, унаследованный от класса Shape и поддерживающего протокол Serializable, то эту переменную можно описать следующим образом:
Обратите внимание, что подобное описание служит только для сообщения компилятору какие сообщения поддерживает данный объект.
Как и классы, все протоколы в Objective-C представлены при помощи объектов (класса Protocol):
Для предварительного объявления протоколов можно использовать следующую конструкцию:
Это конструкция сообщает компилятору о том, что MyProto, Serializable и Drawable являются именами протоколов, которые будут определены позже.
Обработка исключений
В языке Objective-C поддерживается обработка исключений очень похожая на используемую в языках C++ и Java.
Для этого служат директивы @try, @catch, @finally и @throw.
Для запуска исключения используется директива @throw, в качестве аргумента берущая указатель на объект-исключение. Обычно в Mac OS X/NextStep для этой цели используются объекты класса NSException.
Внутри @catch-блоков директива @throw может использоваться без параметра для повторного запуска обрабатываемого исключение (rethrowing exception).
Синхронизация
Язык Objective-C поддерживает синхронизацию для многопоточных приложений. При помощи директивы @synchronized () можно защитить фрагмент кода от одновременного выполнения сразу несколькими нитями.
@synchronized () берет на вход указатель на объект языка Objective-C (можно использовать для этой цели любой объект, в том числе и self), который играет роль мьютекса(mutex).
При попытке нити начать выполнение защищенного фрагмента проверяется не выполняется ли уже этот фрагмент какой-либо нитью. Если да, то сравниваются объекты, переданные этими нитями в @synchronized ().
Если эти указатели различаются, то нить, пытающаяся войти в защищенный блок будет приостановлена (suspended) до тех пор, пока первая нить не выйдет из блока. Тогда выполнение второй нити продолжится и уже она «запрет» этот блок для всех остальных нитей.
Наличие подобной возможности заметно облегчает жизнь при написании многонитевых приложений, когда необходимо отслеживать попытки одновременного изменения одних и тех же данных сразу несколькими нитями.
Создание и уничтожение объектов
В самом языке Objective-C нет специальных команд для создания и уничтожения объектов (подобных new и delete). Эта задача ложится на runtime-библиотеку и реализуется при помощи механизма посылки сообщений.
Реально используемой и наиболее широко распространенной схемой создания и уничтожения объектов в Objective-C является используемая в операционных системах NextStep и Mac OS X, которая и будет описана ниже.
Обратите внимание, что сообщение alloc посылается class object-у требуемого класса и это сообщение возвращает указатель на выделенную под объект память.
Собственно сама инициализация объекта (т.е. установка значений его instance-переменных, выделение дополнительных ресурсов и т.п.) осуществляется другими методами, по традиции имена этих методов начинаются с init. Обычно такое сообщение посылается сразу же после сообщение alloc, по адресу, возвращенному этим сообщением.
Приведенная выше конструкция является правильным способом создания объекта. Обратите внимание, что следующая конструкция может в ряде случаев не работать:
Это связано с тем, что для ряда классов метод init может вернуть совсем другой указатель (а не self).
Простейшими примерами того, когда может возникать подобная ситуация, являются синглетоны (тогда, если один экземпляр класса уже существует, то метод init освободит выделенную alloc‘ом память и вернет указатель на уже созданный единственный экземпляр) и кэширование объектов, когда для увеличения производительности, выделение объектов происходит сразу блоками и объекты не уничтожаются, а сохраняются для переиспользования.
При создании нового класса обычно нет необходимости переопределять метод alloc, а вот необходимость переопределения метода init возникает достаточно часто (хотя во многих случаях можно положится на обнуление памяти alloc‘ом).
Поэтому при создании нового класса и метода init вызов переопределенного метода init (при помощи [super init]) должен быть произведен явно в самом начале метода.
Довольно часто у объектов бывает сразу несколько методов, начинающихся с init, например init, initWithName:, initWIthContentsOfFile: и т.д.
Установившейся практикой в таком случае является выделение среди всех init-методов одного, называемого designated initializer. Все остальные init-методы должны вызывать его и только он вызывает унаследованный init метод.
В ряде случаев оказывается удобным совместить выделение памяти и инициализацию объекта в один метод (класса), например в классе NSString есть ряд методов класса, возвращающих уже готовый (проинициализированный) объект:
Посылка объекту сообщения retain увеличивает значение этого счетчика на единицу (так все контейнерные классы библиотеки Foundation при помещении в них объекта, посылают ему сообщение retain).
Установившейся практикой является посылка объекту сообщения retain всеми, заинтересованными в нем сторонами (объектами), т.е. если вы запоминаете ссылку на объект, то следует послать ему сообщение retain.
Когда объект перестает быть нужен, то ему просто посылается сообщение release.
Данное сообщение уменьшает значение счетчика на единицу и, если это значение стало меньше единицы, уничтожает данный объект.
Перед уничтожением объекта ему посылается сообщение dealloc, позволяющее объекту произвести свою деинициализацию. При этом это также является обычным сообщением и в нем Вы явно должны в конце вызвать унаследованную реализацию через [super dealloc].
Категории
Язык Objective-C обладает крайне редко встречающейся возможностью добавлять новые методы к уже существующим классам. При этом не требуется исходников класса и добавленные методы автоматически становятся доступными всем классам, унаследованным от изменяемого.
Механизм, позволяющий расширять уже существующие классы (путем добавление новых методов, новые instance-переменные добавить таким образом нельзя), называется категориями.
Категория имеет свое имя, список методов и имя класса, который она расширяет. Описание категории имеет следующий вид:
Реализация категории выглядит следующим образом:
Class objects и Objective-C runtime
При этом такой объект является полноценным объектом, т. е. ему можно посылать сообщения, передавать в качестве параметра.
Одной из особенностью class object‘а является то, что он поддерживает все методы класса NSObject, т.е. когда ему посылается сообщение, то сначала идет поиск среди методов класса, а если метод не найден, то поиск продолжается среди instance-методов класса NSObject.
Если посмотреть на Objective-C runtime от Apple, то мы найдем большое количество С-функция, служащих для работы с классами (непосредственно во время выполнения программы).
Наиболее интересными являются следующие:
Функция class_getInstanceMethod возвращает указатель на структуру (objc_method) описывающую заданный instance-метод данного класса.
Функция class_getClassMethod возвращает указатель на структуру (objc_method) описывающую заданный метод данного класса.
Функция class_nextMethodList возвращает один из списков методов для заданного класса. Приводимый ниже фрагмент кода позволяет перебрать все методы для данного класса.
Функция class_addMethods позволяет добавлять новые методы к заданному классу.
Функция class_removeMethods позволяет убирать методы из заданного класса.
Функция method_getNumberOfArguments Возвращает количество аргументов для заданного метода.
Функция method_getSizeOfArguments возвращает размер места на стеке, занимаемого всему аргументами данного метода.
Функция method_getArgumentInfo возвращает информацию об одном из аргументов для заданного метода..
Функция class_getInstanceVariable возвращает информацию об instance-переменной класса в виде указателя на структуру objc_ivar.
Для кодирования информации о типах используется специальное строковое представление, однозначно сопоставляющее каждому типу данных некоторую строку. Явно получить такую строку для произвольного типа можно при помощи конструкции @encode ().
Разное
Крайне полезным (и пожалуй главным) источником информации по языку является сайт developer.apple.com.
Также ряд полезной информации по языку Objective-C можно найти в news-группе comp.lang.objective-c.
Проект GNUstep представляет собой попытку создания open-source библиотек на Objective-C, являющихся аналогом библиотек Foundation и AppKit в NextStep и Mac OS X.
На сайте проекта GNUstep Вы найдете много примеров использование языка Objective-C и приложений, написанных на нем.
Поскольку компилятор gcc поддерживает язык Objective-C, то практически каждый дистрибутив Linux позволяет установить поддержку для него.
Для работы с Objective-C под M$ Windows можно использовать компиляторы mingw и cygwin, необходимо только установить библиотеку для поддержки языка.
В качестве редактора, поддерживающего выделение синтаксиса для Objective-C можно использовать бесплатный notepad++.
Начальное руководство по C# для разработчиков Objective-C
Xamarin.iOS позволяет использовать платформенно-независимый код, созданный на языке C#, на нескольких платформах. Однако существующим приложениям iOS может потребоваться использовать Objective-C уже созданный код. Эта статья выступает в качестве краткого учебника для Objective-C разработчиков, которые стремятся перейти на Xamarin и язык C#.
Приложения для iOS и macOS, созданные на языке Objective-C, могут использовать код Xamarin и C# там, где не требуется код для конкретной платформы, за счет чего он будет также работать на устройствах не от Apple. Благодаря такому механизму можно применять на нескольких платформах разные элементы, например веб-службы, средства анализа JSON и (или) XML, любые пользовательские алгоритмы.
Чтобы использовать возможности Xamarin и по-прежнему поддерживать имеющиеся ресурсы Objective-C, код Objective-C можно сделать доступным в управляемом коде C# с помощью реализованной в Xamarin технологии привязок. Также вы всегда можете портировать код на C#, преобразовав каждую строку. Какой бы подход вы ни выбрали (привязка или портирование), необходимо иметь определенное знание языков Objective-C и C#, чтобы эффективно использовать существующий код Objective-C вместе с Xamarin.iOS.
Взаимодействие с Objective-C
В настоящее время не существует поддерживаемого механизма для создания библиотеки C#, использующей Xamarin.iOS, которую можно было бы вызывать из Objective-C. В первую очередь это связано с тем, что, помимо привязки, потребуется и среда выполнения Mono. Однако вы все равно можете создавать на Objective-C основную программную логику, включая пользовательские интерфейсы. Для этого необходимо заключить код Objective-C в библиотеку и создать к ней привязку. Xamarin.iOS потребуется только для начальной загрузки приложения (чтобы создать точку входа Main ). Вся логика, выполняемая после этого, может быть написана на Objective-C и предоставлена в C# через привязку (либо с помощью P/Invoke). Такой механизм позволит вам сохранить на Objective-C всю логику работы с конкретной платформой, а на C# создавать платформенно-независимые компоненты.
В текущей статье выделены некоторые важные сходства и различия двух обсуждаемых языков. Это руководство поможет вам перейти к применению C# на платформе Xamarin.iOS любым из двух способов: создать привязку существующего кода Objective-C или портировать его на C#.
Сравнение языков
Языки Objective-C и C# значительно отличаются друг от друга как синтаксически, так и в плане среды выполнения. Objective-C является динамическим языком со схемой передачи сообщений, а C# использует статическую типизацию. По синтаксису Objective-C очень похож на Smalltalk, тогда как C# унаследовал почти весь базовый синтаксис от Java, хотя за последние годы в нем появилось множество дополнительных возможностей и отличий.
Тем не менее, в Objective-C и C# есть несколько почти аналогичных языковых функций. Понимание различий полезно при создании привязки C# к коду Objective-C или при портировании Objective-C на C#.
Сравнение протоколов и Интерфейсы
Категории и Методы расширения
Objective-C позволяет добавлять методы в класс, для которого не может быть кода реализации по Objective-C. В C# похожая концепция применяется через методы расширения.
Методы расширения позволяют добавлять в класс статические методы, а статические методы в C# аналогичны методам класса в Objective-C. Например, следующий код добавляет метод с именем ScrollToBottom в UITextView класс, который, в свою очередь, является управляемым классом, привязанным к Objective-C UITextView классу из UIKit:
При вызове метода расширения экземпляр передается в качестве аргумента, как, например, textView в этом примере.
Сравнение платформ и Сборки
Сравнение селекторов и именованных параметров
Методы Objective-C обязательно включают в селекторы имена параметров. Это обусловлено принципом их работы. Например, селектор AddCrayon:WithColor: четко указывает назначение каждого параметра при использовании в коде. C# также предлагает дополнительную поддержку именованных аргументов.
Например, представленный выше код можно реализовать в C# с помощью именованных аргументов следующим образом:
В C# версии 4.0 реализована поддержка этой возможности, но на практике она применяется довольно редко. Тем не менее при необходимости вы всегда можете ею воспользоваться.
Заголовки и пространства имен
Objective-C является надстройкой над языком C и для объявления публичных элементов использует файлы заголовков, отдельные от файла реализации. В C# не используются файлы заголовков. В отличие от Objective-C, код C# содержится в пространствах имен. Чтобы включить код, существующий в определенном пространстве имен, вы можете добавить в начало файла реализации директиву using или указать использовать полное имя типа вместе с пространством имен.
Кроме того, ключевое слово namespace в приведенном выше коде задает пространство имен, используемое для самого файла реализации. Если несколько файлов реализации используют одно пространство имен, то это пространство имен не обязательно включать в директиву using, так как такое включение подразумевается по умолчанию.
Свойства
Как в Objective-C, так и в C# используется понятие свойств, которые представляют собой высокоуровневую абстракцию для методов доступа. В Objective-C директиве компилятора @property используется для эффективного создания методов доступа. А в C# свойства поддерживаются в самом языке. В C# свойство можно реализовать двумя способами: длинный синтаксис для обращения к резервному полю или более короткий синтаксис автоматического свойства. Эти способы представлены в следующих примерах:
Ключевое слово static
Ключевое слово static имеет очень разные значения между и C#. В Objective-C статические функции позволяют ограничить область действия функции текущим файлом. А в C# области поддерживается через ключевые слова public, private и internal.
Переменная в Objective-C, к которой применено ключевое слово static, сохраняет свое значение при разных вызовах функций.
В C# также используется ключевое слово static. Если оно применяется к методу, оно по сути делает то же, что модификатор + в Objective-C. Проще говоря, это ключевое слово используется, чтобы создать метод класса. Его можно применить и к другим конструкциям, например к полям, свойствам и событиям. В таком случае они становятся частью самого типа, в котором объявлены, а не частью экземпляра этого типа. Вы можете даже создать статический класс, в котором все определенные методы также должны быть статическими.
Сравнение NSArray и Инициализация списка
Сравнение блоков и Лямбда-выражения
Дополнительные сведения о лямбда-выражениях см. в руководстве по программированию на C#, предоставленном корпорацией Майкрософт.
Сводка
В этой статье мы сравнили широкий спектр возможностей языков Objective-C и C#. Некоторые из этих возможностей в обоих языках практически идентичны, например блоки и лямбда-выражения или категории и методы расширения. Но есть несколько аспектов, по которым языки заметно различаются, например концепция пространства имен в C# и значение ключевого слова static.