Klasy i obiekty Objective-C
Głównym celem języka programowania Objective-C jest dodanie orientacji obiektowej do języka programowania C, a klasy są centralną cechą Objective-C, które obsługują programowanie obiektowe i są często nazywane typami zdefiniowanymi przez użytkownika.
Klasa służy do określenia formy obiektu i łączy reprezentację danych oraz metody manipulowania tymi danymi w jeden zgrabny pakiet. Dane i metody w klasie nazywane są członkami klasy.
Charakterystyka celu-C
Klasa jest zdefiniowana w dwóch różnych sekcjach, a mianowicie @interface i @implementation.
Prawie wszystko ma postać przedmiotów.
Obiekty odbierają komunikaty, a obiekty są często nazywane odbiornikami.
Obiekty zawierają zmienne instancji.
Obiekty i zmienne instancji mają zasięg.
Klasy ukrywają implementację obiektu.
Właściwości służą do zapewnienia dostępu do zmiennych instancji klas w innych klasach.
Definicje klasy celu-C
Definiując klasę, definiujesz plan dla typu danych. W rzeczywistości nie definiuje to żadnych danych, ale definiuje, co oznacza nazwa klasy, czyli z czego będzie się składał obiekt tej klasy i jakie operacje można wykonać na takim obiekcie.
Definicja klasy zaczyna się od słowa kluczowego @interfacepo którym następuje nazwa interfejsu (klasy); i treść klasy, ujęta w nawiasy klamrowe. W Objective-C wszystkie klasy pochodzą z klasy bazowej o nazwieNSObject. Jest to nadklasa wszystkich klas Objective-C. Zapewnia podstawowe metody, takie jak alokacja pamięci i inicjalizacja. Na przykład zdefiniowaliśmy typ danych Box za pomocą słowa kluczowegoclass w następujący sposób -
@interface Box:NSObject {
//Instance variables
double length; // Length of a box
double breadth; // Breadth of a box
}
@property(nonatomic, readwrite) double height; // Property
@end
Zmienne instancji są prywatne i są dostępne tylko wewnątrz implementacji klasy.
Alokacja i inicjalizacja obiektów Objective-C
Klasa zapewnia plany obiektów, więc zasadniczo obiekt jest tworzony z klasy. Deklarujemy obiekty klasy z dokładnie takim samym rodzajem deklaracji, jak deklarujemy zmienne typu podstawowego. Następujące instrukcje deklarują dwa obiekty klasy Box -
Box box1 = [[Box alloc]init]; // Create box1 object of type Box
Box box2 = [[Box alloc]init]; // Create box2 object of type Box
Oba obiekty box1 i box2 będą miały własną kopię członków danych.
Dostęp do członków danych
Dostęp do właściwości obiektów klasy można uzyskać za pomocą operatora bezpośredniego dostępu do elementu członkowskiego (.). Wypróbujmy następujący przykład, aby wyjaśnić sprawę -
#import <Foundation/Foundation.h>
@interface Box:NSObject {
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
}
@property(nonatomic, readwrite) double height; // Property
-(double) volume;
@end
@implementation Box
@synthesize height;
-(id)init {
self = [super init];
length = 1.0;
breadth = 1.0;
return self;
}
-(double) volume {
return length*breadth*height;
}
@end
int main() {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Box *box1 = [[Box alloc]init]; // Create box1 object of type Box
Box *box2 = [[Box alloc]init]; // Create box2 object of type Box
double volume = 0.0; // Store the volume of a box here
// box 1 specification
box1.height = 5.0;
// box 2 specification
box2.height = 10.0;
// volume of box 1
volume = [box1 volume];
NSLog(@"Volume of Box1 : %f", volume);
// volume of box 2
volume = [box2 volume];
NSLog(@"Volume of Box2 : %f", volume);
[pool drain];
return 0;
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
2013-09-22 21:25:33.314 ClassAndObjects[387:303] Volume of Box1 : 5.000000
2013-09-22 21:25:33.316 ClassAndObjects[387:303] Volume of Box2 : 10.000000
Nieruchomości
Właściwości są wprowadzane w celu-C, aby zapewnić, że do zmiennej wystąpienia klasy można uzyskać dostęp poza klasą.
Poszczególne części deklaracji właściwości są następujące.Właściwości zaczynają się od @property, który jest słowem kluczowym
Po nim znajdują się specyfikatory dostępu, które są nieatomowe lub atomowe, tylko do odczytu lub do odczytu i silne, unsafe_unretained lub słabe. Zależy to od typu zmiennej. Dla dowolnego typu wskaźnika możemy użyć silnego, unsafe_unretained lub słabego. Podobnie w przypadku innych typów możemy użyć readwrite lub readonly.
Po nim następuje typ danych zmiennej.
Wreszcie mamy nazwę właściwości zakończoną średnikiem.
W klasie implementacji możemy dodać instrukcję synthesize. Ale w najnowszym XCode, część syntezy jest obsługiwana przez XCode i nie ma potrzeby dołączania instrukcji synthesize.
Jest to możliwe tylko dzięki właściwościom, do których mamy dostęp do zmiennych instancji klasy. W rzeczywistości dla właściwości tworzone są wewnętrznie metody pobierające i ustawiające.
Na przykład załóżmy, że mamy właściwość @property (nonatomic ,readonly ) BOOL isDone. Pod maską znajdują się setery i gettery utworzone w sposób pokazany poniżej.
-(void)setIsDone(BOOL)isDone;
-(BOOL)isDone;