Objective-C Language
Klasy i przedmioty
Szukaj…
Składnia
- Cat * cat = [[Cat podział] init]; // Utwórz obiekt cat typu Cat
- Pies * pies = [[Przydział psa] init]; // Utwórz obiekt psa typu Dog
- NSObject * someObject = [Alokacja NSObject]; [someObject init]; // nie rób tego
- XYZObject * object = [XYZObject new]; // Użyj new do tworzenia obiektów, jeśli do inicjalizacji nie są potrzebne żadne argumenty
- NSString * someString = @ "Witaj, świecie!"; // Tworzenie NSString z dosłowną składnią
- NSNumber * myFloat = @ 3.14f; // Kolejny przykład tworzenia numeru NSNumber przy użyciu dosłownej składni
- NSNumber * myInt = @ (84/2); // Utwórz obiekt za pomocą wyrażenia w ramce
Tworzenie klas z wartościami inicjalizacji
#import <Foundation/Foundation.h>
@interface Car:NSObject {
NSString *CarMotorCode;
NSString *CarChassisCode;
}
- (instancetype)initWithMotorValue:(NSString *) motorCode andChassisValue:(NSInteger)chassisCode;
- (void) startCar;
- (void) stopCar;
@end
@implementation Car
- (instancetype)initWithMotorValue:(NSString *) motorCode andChassisValue:(NSInteger)chassisCode{
CarMotorCode = motorCode;
CarChassisCode = chassisCode;
return self;
}
- (void) startCar {...}
- (void) stopCar {...}
@end
Do inicjowania obiektów Car zostanie użyta metoda initWithMotorValue: type andChassisValue: type
Singleton Class
Co to jest klasa Singleton?
Klasa singleton zwraca tę samą instancję bez względu na to, ile razy aplikacja tego zażąda. W przeciwieństwie do zwykłej klasy, obiekt singleton zapewnia globalny punkt dostępu do zasobów swojej klasy.
Kiedy stosować klasy Singleton?
Singletony są używane w sytuacjach, w których pożądany jest ten pojedynczy punkt kontroli, na przykład w przypadku klas oferujących pewne ogólne usługi lub zasoby.
Jak tworzyć klasy Singleton
Najpierw utwórz Nowy plik i podklasę z NSObject
. Nazwij cokolwiek, CommonClass
tutaj CommonClass
. Xcode będzie teraz generował dla Ciebie pliki CommonClass.h i CommonClass.m.
W pliku CommonClass.h
:
#import <Foundation/Foundation.h>
@interface CommonClass : NSObject {
}
+ (CommonClass *)sharedObject;
@property NSString *commonString;
@end
W pliku CommonClass.m
:
#import "CommonClass.h"
@implementation CommonClass
+ (CommonClass *)sharedObject {
static CommonClass *sharedClass = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedClass = [[self alloc] init];
});
return sharedClass;
}
- (id)init {
if (self = [super init]) {
self.commonString = @"this is string";
}
return self;
}
@end
Jak korzystać z klas Singleton
Utworzona wcześniej klasa Singleton będzie dostępna z dowolnego miejsca w projekcie, o ile zaimportujesz plik CommonClass.h
do odpowiedniego modułu. Aby zmodyfikować i uzyskać dostęp do udostępnionych danych w klasie Singleton, będziesz musiał uzyskać dostęp do udostępnionego obiektu tej klasy, do którego można uzyskać dostęp za pomocą metody sharedObject
, jak poniżej:
[CommonClass sharedObject]
Aby odczytać lub zmodyfikować elementy w klasie współdzielonej, wykonaj następujące czynności:
NSString *commonString = [[CommonClass sharedObject].commonString; //Read the string in singleton class
NSString *newString = @"New String";
[CommonClass sharedObject].commonString = newString;//Modified the string in singleton class
Typ zwracany „instancetype”
Objective-C obsługuje specjalny typ o nazwie `instancetype, którego można używać tylko jako typu zwracanego przez metodę. Ocenia klasę obiektu odbierającego.
Rozważ następującą hierarchię klas:
@interface Foo : NSObject
- (instancetype)initWithString:(NSString *)string;
@end
@interface Bar : Foo
@end
Gdy wywoływane jest [[Foo alloc] initWithString:@"abc"]
, kompilator może wywnioskować, że typem zwracanym jest Foo *
. Klasa Bar
wywodząca się z Foo
ale nie przesłaniała deklaracji inicjalizatora. Jednak dzięki instancetype
kompilator może wywnioskować, że [[Bar alloc] initWithString:@"xyz"]
zwraca wartość typu Bar *
.
Zastanów się, czy zwracanym typem jest -[Foo initWithString:]
będący Foo *
: gdybyś [[Bar alloc] initWithString:]
, kompilator wywnioskowałby, że zwracane jest Foo *
, a nie Bar *
co jest intencją deweloper. Typ instancetype
rozwiązał ten problem.
Przed wprowadzeniem typu instancetype
, inicjatory, metody statyczne, takie jak akcesory singleton i inne metody, które chcą zwrócić instancję klasy odbierającej, muszą zwrócić id
. Problem polega na tym, że id
oznacza „obiekt dowolnego typu” . Kompilator nie jest zatem w stanie wykryć, że NSString *wrong = [[Foo alloc] initWithString:@"abc"];
przypisuje do zmiennej o niepoprawnym typie.
Z powodu tego problemu inicjalizatory zawsze powinny używać wartości instancetype
zamiast id
jako wartości zwracanej.
Określanie ogólnych
Możesz ulepszyć własne klasy za pomocą ogólnych, takich jak NSArray
lub NSDictionary
.
@interface MyClass<__covariant T>
@property (nonnull, nonatomic, strong, readonly) NSArray<T>* allObjects;
- (void) addObject:(nonnull T)obj;
@end
Różnica między alokacją a inicjalizacją
W większości języków obiektowych przydzielanie pamięci dla obiektu i inicjowanie go jest operacją atomową:
// Both allocates memory and calls the constructor
MyClass object = new MyClass();
W Celu C są to osobne operacje. Metody klasowe alloc
(i jego historyczne rodzeństwo allocWithZone:
powodują, że środowisko wykonawcze Objective-C rezerwuje wymaganą pamięć i czyści ją. Z wyjątkiem kilku wewnętrznych wartości, wszystkie właściwości i zmienne są ustawione na 0 / NO
/ nil
.
Obiekt jest wtedy już „prawidłowy”, ale zawsze chcemy wywołać metodę, aby faktycznie skonfigurować obiekt, który nazywamy inicjalizatorem . Służą one do tego samego celu, co konstruktory w innych językach. Zgodnie z konwencją metody te zaczynają się od init
. Z punktu widzenia języka są to zwykłe metody.
// Allocate memory and set all properties and variables to 0/NO/nil.
MyClass *object = [MyClass alloc];
// Initialize the object.
object = [object init];
// Shorthand:
object = [[MyClass alloc] init];