Переходим к нашему следующему пункту разбора вопросов на собеседовании. Теперь мы разбираем обьектно-ориентированное программирование в приложении к Objective-C.
Нас интересует следующее — обьект-класс, интерфейс, реализация, свойства, протоколы, методы.
Objective-C является надмножеством языка С и во многом схож с ним. Объект реализуется через класс. Класс это некая структура описывающая хранимые данные и методы взаимодействия с ними. Так же как и в С класс находится в двух файлах — заголовочном с расширением .h и файле реализации с расширением .m (m — модуль,). В заголовочном файле содержится описание методов, переменных и прочих нужных вещей. Только описание. А вот в файле реализации эти все полезные штуки реализуются , отсюда и название.
Разберем пару пустых файлов созданных в XCode
Файл заголовка
#import <Foundation/Foundation.h>
@interface testItem : NSObject{
NSString *testString;
}
-(void)setTestString:(NSString *) str;@end
Что мы видим в этом файле, в первой строке идет импорт базового фреймворка Foundation описывающего основы всех обьектов. Далее идет интерфейс обьекта. Он соответствует интерфейсу базового обьекта NSObject, описывающего базовый интерфейс обьекта. Об этом далее.
В фигурных скобках мы видим описание переменной testString имеющей тип NSString (объектный тип релизующий строку )
И ниже описание метода сеттера нашей переменной. В качестве параметра он будет принимать строку с типом NSString
Ну и @end как понятно из контекста это конец описания и файла.
Файл реализации
#import «testItem.h»
@implementation testItem
-(void)setTestString:(NSString *) str
{
testString = str;
}
@end
Тут тоже все не очень сложно. В первой строке мы импортируем наш заголовочный файл с описаниями, в во второй начинаем реализацию (англ. implementation)
Далее идет метод нашего класса test, устанавливающий значение переменной. Можно еще реализовать метод выводящий значение переменной и мы получим классическую реализацию методов акцессоров типа setter и getter. Метод сеттера в нашем случае очень простой и присваивает переменной значение аргумента метода-функции (от англ Set устанавливать).
Ну а теперь представим себе сферического коня в вакууме, то есть некий код использующий наш обьект.
testItem *t = [[testItem alloc] init];
[t setTestString:@»test»];
NSLog(@»%@»,[t testString]);
В первой строке мы создаем объект t посылая ему сообщения alloc и init, alloc создает экземпляр класса и возвращает указатель на него, а init в идеале выполняет некую работу по инициализации обьекта. В нашем случае мы это не реализовывали и этот метод будет наследоваться от базового суперкласса и на текущем этапе его можно проигнорировать.
Во второй строке мы присваиваем обьекту t строку test через созданный ранее сеттер.
Ну а в третьей через метод вывода логовых сообщений выводим это значение в debug консоль.
Теперь рассмотрим другой вариант с использованием свойств
Заголовочный файл
@interface test : NSObject
@property (nonatomic) NSString *testString;
@end
Файл реализации
@implementation test
@synthesize testString;
@end
Функционально тоже самое. Мы описали и синтезировали свойство testString и система сама создаст методы сеттера и геттера.
Протокол Objective-C – это некое соглашение о используемых методах классов. С его помощью можно согласовать что в нужном классе будет необходимый метод. Это почти тоже самое что и интерфейс :). В общем мы описывали интерфейс в заголовочном файле и они описывает что может класс, а вот протокол необходим для взаимодействия с внешними обьектами. Т.е. мы можем его дополнительно создать, выделить в него несколько методов которые будут использоваться другими классами. В общем описание сумбурное, но сформулировать четче я пока не могу.
Комментариев нет