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];


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow