objective-c — вопросы с ответами

Как становится понятно из названия, Objective-C основан на языке программирования C с множеством объектно-ориентированных функций. Первоначально он был разработан в начале 1980-х годов, но действительно завоевал популярность с ростом iOS. Давайте рассмотрим некоторые распространенные вопросы и опасения по поводу Objective-C.

C? C++? C#? И что это дает?

Objective-C – далеко не единственный популярный язык программирования, появившийся от C. Сначала свет увидел C++, который сначала назвали “C with Classes”. Идея состояла в том, чтобы привнести классы и другие объектно-ориентированные функции в C, и C++ стал популярным из-за его сочетания возможностей C с преимуществами объектно-ориентированного подхода. C# был создан Microsoft для дальнейшего продвижения C++ по объектно-ориентированному пути. Сначала он был очень похож на крайне популярный язык под названием Java, хотя с тех пор они разошлись в функциях, несмотря на то, что имели почти идентичный основной синтаксис. Приятная вещь во всех этих языках, полученных из C, состоит в том, что большая часть основного синтаксиса одинакова. Переменные часто объявляются и используются одинаково, и важные ключевые слова и символы обычно также повторяются.

Что значит “объектно-ориентированный”?

Объектно-ориентированный язык – это язык, построенный вокруг концепции объектов. Осмотрите свою комнату и подумайте о каждой вещи как об объекте. Например, сейчас у меня на столе кружка. Как объект, его имя – кружка, и у него есть такие свойства, как его цвет и то, сколько жидкости он будет держать. Объектно-ориентированные языки позволяют нам определять объекты, такие как кружки, и получать доступ к их свойствам в нашем коде. Мы также можем отправлять запросы объектам. К примеру, своей кружке я могу задать вопрос, пуста ли она? Затем мы можем создавать и манипулировать всеми видами объектов, чтобы делать разные вещи в нашем приложении. Например, мы можем использовать объект Camera, чтобы сделать фотографию. Объект Camera представляет физическую камеру на iPhone, но таким образом, что мы можем взаимодействовать с ней с помощью кода.

А что насчет всех этих скобочек в синтаксисе?

Objective-C поддерживает старый добрый синтаксис и функции C. Добавленные объектно-ориентированные функции были сделаны в модели Smalltalk, в которой мы отправляем сообщения объектам следующим образом:

Сообщение makeEmpty отправляется объекту кружки. В Objective-C мы просто заключаем такие действия в квадратные скобки:

То, что на первый взгляд может показаться произвольным набором скобок, со временем и практикой будет иметь смысл как механизм организации кода вокруг этих объектно-ориентированных концепций, которые были добавлены в виде тонкого слоя поверх обычного кода C.

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

Некоторые из наиболее распространенных типов данных, которые мы используем в Objective-C, включают:

  • Int – целочисленное значение, то есть целое число (без десятичных дробей), которое включает в себя ноль и отрицательные числа;
  • Float – значение с плавающей запятой, которое включает в себя столько десятичных разрядов, сколько оно может содержать. Поскольку десятичный разряд может меняться или плавать, важно знать, что эти значения могут быть технически неточными. Когда нужны точные десятичные дроби, например, для валюты, мы должны использовать тип данных NSDecimalNumber;
  • BOOL – сокращение от “логическое”, это 1-битное “истинное” или “ложное” значение, которое может быть только в одном из этих состояний. Язык C (и, следовательно, Objective-C) рассматривает 0 как “ложный” и 1 как “истинный”. Таким образом, следующие ключевые слова могут использоваться для представления значений true/false: YES/NO, TRUE/FALSE, true/false, 1,0;
  • Char – одиночный символ, такой как буква A или символ “#”. Обратите внимание, что строчные и прописные символы разные, поэтому “а” и “А” – это два разных символа;
  • NSString (Строковые данные) – это набор символов, соединенных вместе для создания текста, как баннер на вечеринке;
  • NSNumber – этот класс является легким “классом-оберткой”, который предоставляет объектно-ориентированные функции для упомянутых выше типов примитивных чисел (среди прочих).

Первые четыре типа данных в приведенном выше списке, int, float, BOOL и char, являются скалярными (необъектными) типами данных, что означает, что они относительно просты и понятны. Слово "примитив" также используется для описания данных этого типа, так как они не так продвинуты, как типы данных Object. Другие скалярные типы данных включают короткие, двойные и длинные. NSString и NSNumber начинаются с заглавных букв, потому что они являются более сложными типами данных. На самом деле они являются объектами, и в Objective-C соглашение об именах таково, что имена объектов должны начинаться с заглавной буквы. Объект отличается от примитивного типа данных, потому что он имеет более сложные свойства и методы, доступные для него, тогда как примитивные типы данных ограничены и просты. Например, мы можем отправить сообщение с именем length объекту NSString, и NSString сообщит нам, сколько символов в тексте. Тип данных int не отвечает ни на какие подобные сообщения. Вам также может быть интересно, почему NSString и NSNumber начинаются с букв "NS", а не с названий String и Number. Объекты определены в файлах классов и все классы, которые используются в Objective-C, загружаются в одно и то же место. А это значит, что классы с одинаковыми именами могут вызывать проблемы. Чтобы попытаться избежать одинаковых имен, Objective-C принял соглашение о добавлении двух- или трехбуквенного префикса к именам классов, чтобы указать, откуда они берутся. "NS" происходит от NeXT и NeXTSTEP Computer, которую основал Стив Джобс после того, как в 80-х годах был вынужден покинуть Apple.

Комментарии к коду

Хороший комментарий может стоить усилий тысячи программистов (хотя обратное также верно). Так что иногда может быть невероятно полезно документировать код, который мы пишем, внутри самого кода. Такие заметки составляются для себя или других разработчиков, чтобы объяснить, что делает код.

Это верно и в Objective-C, и в других языках программирования. Комментарии в коде Objective-C –это строки кода, которые не влияют на работу программы. Они носят исключительно информационный характер и призваны помочь нам понять, как работает код или как он организован.

Однострочные комментарии

Однострочные комментарии начинаются с двух косых черт: //. Все содержимое строки после косой черты составляет комментарий и полностью игнорируется программой.

Многострочные комментарии

Иногда нам нужны более длинные комментарии, которые занимают более одной строки. В этом случае мы используем открывающий маркер, чтобы отметить начало комментария: /*, и закрывающий маркер, чтобы отметить конец комментария: */.

Методы в Objective-C

Термины "метод", "сообщения" и "функция" относятся к одной и той же вещи в Objective-C. Вы уже могли слышать, что они используются взаимозаменяемо, хотя есть и некоторые различия. Метод (или сообщение или функция) – это фрагмент кода, который мы можем вызвать из другого места в нашем коде, и метод выполнит какое-либо действие или вернет какой-то результат, который мы можем использовать. Методы используются для организации нашего кода в многократно используемые (и понятные) фрагменты, которые экономят нам много времени и сил.

Давайте проиллюстрируем эту концепцию на примере. Класс NSString имеет метод length, который показывает нам количество символов в строке. Определение и код для этого примера могут выглядеть следующим образом:

Строка 1 объявляет метод с именем length. Самый первый символ – тире: "–". В Objective-C определения методов начинаются либо с тире (–), либо с плюса (+). Тире означает, что это метод экземпляра, к которому может обращаться только экземпляр класса, в котором этот метод определен. Знак плюс означает, что метод является методом класса, к которому можно получить доступ в любое время, просто ссылаясь на класс.

В пределах нашего примера это означает, что нам нужно вызвать метод length для реальной строки, экземпляра NSString. Звучит все довольно логично, потому что мы бы хотели знать только длину реальных струн. Метод класса (со знаком плюс) будет использоваться в других обстоятельствах, например, когда мы сначала хотим создать переменную экземпляра NSString.

После тире (или плюса) мы имеем пару круглых скобок с важным словом внутри. Это слово является типом возврата метода. Другими словами, оно указывает, какой тип данных будет возвращен этим методом. В этом примере мы собираемся вернуть простое int, потому что длина будет просто числом.

Некоторые методы будут выполнять определенную работу, но фактически не будут возвращать никаких данных. В этих случаях мы используем специальное ключевое слово "void", чтобы указать, что данные не будут возвращены: (void). Если бы мы хотели вернуть строку вместо этого, мы бы поставили "NSString *" в скобках: (NSString *).

Далее мы получаем фактическое название метода. В этом простом примере имя просто "length". Затем у нас есть пара фигурных скобок, которые окружают строки кода, составляющие метод. Если метод возвращает данные (т. е. его тип возврата не равен (void)), тогда последняя строка метода должна содержать ключевое слово return, за которым следуют данные, которые должны быть возвращены. Ключевое слово return завершает выполнение метода, поэтому любой код, написанный после этого, не будет выполнен.

10 ответов
В моих проектах Objective-C я часто использую файл глобальных констант для хранения таких вещей, как имена уведомлений и ключи для NSUserDefaults. Это выглядит примерно так: @interface GlobalConstants : NSObject extern NSString *someNotification; @end @implementation GlobalConstants NSString *so...
08 окт. 2014, в 08:45
42 ответа
У меня есть приложение, где вставка разделителя UITableView установлена ​​на пользовательские значения - Right 0, Left 0. Это отлично работает в iOS 7.x, однако в iOS 8.0 я вижу, что вставка разделителя установлена ​​по умолчанию 15 справа. Хотя в xib файлах он установлен на 0, он все равно отобража...
uitableview
ios8
10 сен. 2014, в 17:09
16 ответов
Как правило, файл хранилища sqlite для приложений с основными данными находится в Библиотекa > Поддержка приложений > iPhone Simulator > 7.1 (или в зависимости от того, какую версию вы используете) > Приложения > (какая папка содержит ваше приложение) > Документы но я не могу на...
10 июнь 2014, в 06:24
31 ответ
Недавно я работал над добавлением Swift в существующий проект, чтобы попробовать его в реальной жизни. После добавления исходного файла Swift в проект у меня не возникает проблем с получением "Bridging Header", то есть Objective-C для Swift. Но файл заголовка *-Swift.h который должен предоставлят...
05 июнь 2014, в 15:35
14 ответов
Проблема Я начал смотреть новый Swift на Xcode 6, и я попробовал некоторые демонстрационные проекты и учебные пособия. Теперь я застрял в: Создание и представление viewController из определенной раскадровки Objective-C Решение UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"myStory...
uiviewcontroller
04 июнь 2014, в 12:56
13 ответов
Возможно ли это в Swift? Если нет, то есть ли это обходное решение?
swift-extensions
swift-protocols
04 июнь 2014, в 08:03
16 ответов
Я прочитал "Язык программирования Swift" Apple в iBooks, но не могу понять, как сделать запрос HTTP (что-то вроде CURL) в Swift. Нужно ли мне импортировать классы Obj-C или мне просто нужно импортировать библиотеки по умолчанию? Или невозможно сделать HTTP-запрос на основе собственного быстрого кода...
macos
foundation
osx
03 июнь 2014, в 13:35
17 ответов
На новом языке Swift от Apple, как вы вызываете Objective-C код? Apple упомянула, что они могут сосуществовать в одном приложении, но означает ли это, что можно технически повторно использовать старые классы, сделанные в Objective-C, при создании новых классов в Swift? Рассуждение Objective-C - н...
02 июнь 2014, в 20:30
41 ответ
У меня есть приложение, для которого иногда требуется панель навигации, чтобы вписаться в контент. Кто-нибудь знает, как избавиться или изменить цвет этого раздражающего бара? На изображении ниже ситуации у меня есть - я говорю об этой строке высоты 1px ниже "Root View Controller" [IMG_OUR_ID=52.p...
uinavigationbar
ipad
07 окт. 2013, в 14:16
16 ответов
Как программно установить InitialViewController для раскадровки? Я хочу открыть свою раскадровку для другого представления в зависимости от какого-либо состояния, которое может варьироваться от запуска до запуска.
uiviewcontroller
uistoryboard
03 май 2012, в 09:51
6 ответов
У меня есть приложение, в котором пользователь может выбрать изображение либо из встроенных изображений приложений, либо из библиотеки фотографий iphone. Я использую объект Occasion, у которого есть свойство NSString, чтобы сохранить imagePath. Теперь в случае со встроенными изображениями приложения...
nsurl
nsstring
10 нояб. 2011, в 15:55
19 ответов
Как я могу обнаружить любые текстовые изменения в текстовом поле? Метод делегата shouldChangeCharactersInRange работает для чего-то, но он точно не соответствует моей потребности. Поскольку до тех пор, пока он не вернет YES, тексты textField недоступны другим методам наблюдения. например. в моем код...
event-handling
uitextfielddelegate
10 авг. 2011, в 13:25
5 ответов
Кажется довольно ясным, что предполагается, что все будет сделано. Когда он выполняется, Почему существуют две круглые скобки? Является ли __attribute__ функцией? Макрос? Синтаксис? Это работает в C? С++? Работает ли функция, с которой она работает, должна быть статичной? Когда выполняется __a...
gcc
compiler-construction
12 янв. 2010, в 22:19
7 ответов
Я разрабатываю для iPhone и ищу хорошую библиотеку Cocoa/Objective-C для работы с SQLite. Я не хочу использовать стандартный процедурный API SQLite C. Я вижу варианты sqlite.org в разделе Objective-C, но я не уверен, какой из лучших в плане дизайна API библиотек, и функциональность. Я бы хотел испол...
iphone
cocoa-touch
12 март 2009, в 22:17
14 ответов
Как мне преобразовать, NSDate в NSString, чтобы в строку выводился только год в формате @"yyyy?
iphone
nsstring
nsdate
23 фев. 2009, в 01:17
Наверх
Меню