Как вы знаете из главы 2, весь ваш код располагается в том или ином классе. Поэтому первое, что мы должны сделать, — это указать, что понимается под помещением кода “в класс” в языке Objective-C. Как Objective-C решает, лингвистически и структурно, что “данный код предназначен для такого-то класса”?

Для того чтобы написать код для класса, необходимо предоставить два куска, или два раздела кода, именуемые интерфейсом и реализацией. Вот как выглядит полный минимальный код, необходимый для определения класса с именем MyClass. Этот класс настолько минимален, что даже не имеет никаких методов:

@interface MyClass
@end
(^implementation MyClass
@end

Директивы компилятора 0interface и (^implementation указывают компилятору начала разделов интерфейса и реализации определяемого класса, MyClass; соответствующие строки @end показывают, где каждый из этих разделов заканчивается.

В реальной жизни методы MyClass определяются в разделе реализации. Сейчас перед вами класс, который действительно что-то делает:

Ginterface MyClass
Send
(^implementation MyClass
- (NSString*) sayGoodnightGracie { return @"Good night, Gracie!";
}

@end

Обратите внимание, как определен метод. Первая строка представляет собой просто объявление метода, указывающее его тип (метод класса или экземпляра), тип возвращаемого значения, и имя метода, а также типы параметров и их локальные имена (глава 3). Затем в фигурных скобках идет код, выполняемый при вызове метода, так же, как и в случае функции С (глава 1).

Наш минимальный класс по-прежнему бесполезен, потому что он не может быть инстанцирован. В каркасе Cocoa знания о том, как создать экземпляр класса, а также как сделать ряд других вещей, которые должен уметь делать любой класс, находятся в базовом классе, которым является класс NSObject. Таким образом, все классы каркаса Cocoa в конечном итоге должны основываться на классе NSObject, объявляя в качестве суперкласса данного класса NSObject или другой класс, унаследованный от NSObject. (В действительности без явного указания суперкласса объявление нашего класса в Xcode 5 даже не будет компилироваться, а мы получим сообщение “Class ‘MyClass’ defined without specifying a base class” (класс MyClass определен без указания базового класса)).

Синтаксис объявления суперкласса класса представляет собой двоеточие, за которым следует имя суперкласса в строке dinterface:

@interface MyClass : NSObject @end
Simplementation MyClass - (NSString*) sayGoodnightGracie { return @"Good night, Gracie!";
}
@end

NSObject — не единственный базовый класс в каркасе Cocoa. Раньше это 0% было так, но теперь есть и другой базовый класс, NSProxy, который используется только в особых обстоятельствах. Если у вас нет причины наследовать свой класс от некоторого другого класса — наследуйте его от NSObject.

 

В своей наиболее полной форме раздел интерфейса может содержать гораздо больший материал. В частности, если мы хотим объявить наши методы так, чтобы другие классы могли узнать о них и вызывать, объявления этих методов должны находиться в разделе интерфейса. Объявление метода соответствует имени и сигнатуре определения метода и заканчивается (обязательной) точкой с запятой:

@interface MyClass : NSObject
- (NSString*) sayGoodnightGracie;
@end
Simplementation MyClass
- (NSString*) sayGoodnightGracie {
return @"Good night, Gracie!";
)
Send

(В действительности определение метода также может иметь точку с запятой перед фигурными скобками. Но такая запись очень редка, и я ее никогда не использую.)

Следует также упомянуть переменные экземпляра. Если наш класс должен иметь какие-либо переменные экземпляра (за исключением тех, что унаследованы от суперкласса), они должны быть объявлены. В современной версии языка Objective-C вы, вероятно, будете объявлять большинство ваших переменных экземпляра неявно, с помощью методики, которая будет описана в главах 5, и 12. Но и сейчас иногда можно объявить переменную экземпляра явно; в любом случае вам нужно знать, как это делается.

В свое время явное объявление переменных экземпляра должно было находиться в фигурных скобках в начале раздела интерфейса:

@interface MyClass : NSObject (
// Здесь располагаются объявления переменных экземпляра
}
- (NSString*) sayGoodnightGracie;
Send
Simplementation MyClass
- (NSString*) sayGoodnightGracie (
return 0"Good night, Gracie!";
)
Send

Однако начиная с версии компилятора LLVM 3.0 (в среде Xcode 4.2 и более поздних версиях) разрешается размещать объявления переменных экземпляра в фигурных скобках в начале раздела реализации. Это более логичное место для объявления переменных, поскольку, как я объясню в следующем разделе, раздел интерфейса может быть видимым другим классам, в то время как обычно нет никаких причин, по которым другим классам должны быть видимы переменные экземпляра, которые в общем случае являются закрытыми. Поэтому я предпочитаю новый стиль:

@interface MyClass : NSObject
- (NSString*) sayGoodnightGracie;
@end
Simplementation MyClass (
// Здесь располагаются объявления переменных экземпляра
}
- (NSString*) sayGoodnightGracie {
return @"Good night, Gracie!";
}
@end

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

 


Похожие статьи

 

 

 

Добавить комментарий