Статьи

Изучите Цель-C: День 3

Добро пожаловать в третью часть этой серии — надеюсь, вам понравится! На прошлой неделе мы рассмотрели, как мы разделяем классы на отдельные файлы (интерфейс и реализация), на этой неделе мы снова рассмотрим классы, но немного подробнее. Мы также возьмем пик наследования и его работу, а также переменную область видимости.

Пока что мы получили отличные отзывы по электронной почте, в твиттере и комментариях. Приятно видеть, что так много людей интересуются этим предметом, и еще лучше видеть, что многие из вас сами пробуют его и задают несколько замечательных вопросов. Так держать!

Давайте рассмотрим, что мы узнали о классах в этой серии. Если вы не знаете ничего из этого, не стесняйтесь вернуться к последнему уроку, чтобы повторить. Итак, что такое классы?

Класс — это набор инкапсулированных данных и пользовательских методов. Класс может содержать много разных типов данных, и методы класса обычно (но не всегда) выполняют действия, связанные с этими данными. В Objective-C класс обычно состоит из двух файлов: файла интерфейса и файла реализации. Интерфейсный файл использует расширение файла .h по соглашению и является тем, где человек, использующий класс, может быстро найти методы и члены данных, доступные классу. Файл реализации использует расширение файла .m по соглашению и находится там, где находится большая часть кода, потому что он содержит фактическую реализацию всех функций, объявленных в интерфейсе.

Итак, что отличает класс от объекта? Что такое объект? Объект является экземпляром класса. Вспомните наш пример с автомобилем в последней части серии. Где car — это класс, тогда myCar , dansCar и yourCar будут объектами, потому что они являются экземплярами класса car.

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

Многие классы, предоставляемые Apple, начинаются с аббревиатуры «NS», которая обозначает NextStep. Когда Стив Джобс покинул Apple, он основал NeXT, создав компьютеры для рабочих станций, которые работали на его операционной системе. Объектно-ориентированный язык программирования, используемый на этих машинах, назывался NeXTSTEP, откуда мы и получили «NS». Когда Apple «приобрела» (еще один урок истории) NeXTSTEP, они решили основать Mac OS X на NeXTSTEP.

Вот несколько простых, общих классов, которые мы увидим много:

  • NSString — это строка текста, которая является неизменной.
  • NSMutableString — строка текста, которая является изменчивой.
  • NSArray — это массив объектов, который является неизменным.
  • NSMutableArray — это массив объектов, который является изменяемым.
  • NSNumber содержит числовое значение.

Мы узнаем еще много позже, но пока вышесказанное пригодится. Вы, наверное, задаетесь вопросом, что означает изменчивое и неизменное, что является вполне разумным вопросом. Если объект является неизменным, это означает, что когда мы создаем объект и присваиваем значение, он является статическим. Значение не может быть изменено. Если объект изменчив, то он динамический, то есть значение может быть изменено после создания.

Допустим, мы хотим создать статическую строку текста и записать ее в журнал, как бы мы поступили? В нашем коде это будет выглядеть примерно так:

Я создал этот файл в XCode, перейдя в меню «Файл»> «Новый проект»> «Mac OS X»> «Приложение»> «Инструмент командной строки»> «Тип: основа» (довольно путешествие!) И отредактировал файл реализации (расширение: .m) в проекте.

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

Прежде всего, мы импортируем основную библиотеку (это потому, что мы установили тип в Foundation в новом окне проекта ранее).

Это объявляет начальную функцию, которая будет вызвана, когда наша программа начнет выполнение. Два параметра, разделенные запятой, предназначены для передачи аргументов нашему приложению. Пока не беспокойтесь об этом, потому что они нам сейчас не понадобятся.

Теперь мы создадим указатель на объект NSString с именем testString. Как только первая строка завершена, строка еще не существует, только указатель на строку, которую мы еще не создали. На следующей строке мы создаем строку, на которую указывает наш указатель.

В качестве альтернативы мы могли бы написать последнюю строку, подобную этой;

Поначалу это может показаться немного запутанным. В первой версии мы поместили операторы в скобки в одной строке, тогда как во второй мы разделили операторы на две строки. Метод init инициализирует все переменные экземпляра в классе.

Эта строка довольно понятна, поэтому мы добавляем кавычки со знаком @, чтобы сообщить компилятору, что следующий текст является строкой NSString.

NSLog (@ «testString:% @», testString);

Здесь мы записываем некоторую информацию в консоль. XCode имеет встроенный отладчик, который вы можете найти в меню Run. Это очень полезно при разработке приложения для регистрации событий и значений определенных переменных — это может помочь при устранении неполадок в приложении и устранении проблем. Этот метод работает как printf (помните с первой недели?), Где мы предоставляем строку текста с символом замены (% @ означает объект Objective-C).

Узнайте Objective-C

Наконец, мы возвращаем 0, что, как мы знаем, просто говорит операционной системе, что приложение завершилось без проблем.

Помните, когда мы делали нашу NSString ранее, мы использовали метод init? Ну, NSMutableString, NSArray и фактически каждый класс NS также использует init. Кажется, много потраченного впустую кода, чтобы поместить метод init в каждый класс, верно? По этой причине init обычно реализуется только один раз, в корневом классе, известном как NSObject. Поскольку классы наследуются друг от друга, класс, который создается как дочерний от другого, родительский класс автоматически получит доступ к методам родительского класса.

Давайте возьмем NSMutableString например. NSMutableString имеет NSString для родителя (что делает его дочерним), что означает, что он наследуется от NSString. В то же время. NSString имеет NSObject в качестве родителя, поэтому он наследуется от NSObject.

Узнайте Objective-C

Так, например, в NSObject есть метод, называемый init, поэтому каждый подкласс имеет этот реализованный метод, который называется методом класса. На самом деле метод init в NSObject ничего не делает, он просто возвращает себя. Причина этого заключается в том, что методы могут быть перезаписаны. Таким образом, класс NSArray может переопределить init, который он наследует, чтобы добавить к нему функциональность, например, убедиться, что память доступна, или подготовить переменные экземпляра, которые могут ему понадобиться.

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

На этом этапе основы работы классов должны быть понятны. Чтобы проверить свое понимание, посмотрите, можете ли вы ответить на следующие вопросы:

  • В чем разница между классом и объектом?
  • Почему мы используем классы?
  • Почему наследование полезно?

Поскольку классы являются важной частью Objective-C, важно чувствовать себя комфортно, работая с ними. На прошлой неделе мы начали смотреть на уроки, и на этой неделе мы углубились. На следующей неделе, возможно, вы будете рады услышать, что мы собираемся отойти от теоретической стороны и начать работать над нашим собственным простым классом или двумя для выполнения простых задач.

Поскольку мы до сих пор в основном занимались теорией, ваша домашняя работа на этой неделе — просмотр веб-сайта Apple для разработчиков (вы должны были сделать это на прошлой неделе) и просмотр некоторых доступных классов. Если вы не знаете, с чего начать, начните с чего-то вроде NSString. Вам станет легче с деталями родительского класса, методами и так далее. Это будет важно позже, когда вы будете использовать классы вне этой серии и захотите узнать, какие методы они наследуют или используют.

На следующей неделе мы получим больше практических навыков с некоторым кодированием классов. Классы действительно играют центральную роль в Objective-C, поэтому очень важно, чтобы вы с ними справились, и цель этой серии — действительно убедиться, что вы это делаете!

Как обычно, если у вас есть какие-либо вопросы или комментарии, вы можете связаться со мной, оставив комментарий или электронное письмо. Если вы хотите связаться со мной лично и получить быстрый ответ, пришлите мне твит!