Suche…


Syntax

  • Cat * cat = [[Katzezuweisung] init]; // Katzenobjekt vom Typ Kat. Erstellen
  • Hund * Hund = [[Hundezuteilung] Init]; // Hundeobjekt vom Typ Hund erstellen
  • NSObject * someObject = [NSObject-Zuordnung]; [someObject init]; // mach das nicht
  • XYZObject * object = [XYZObject neu]; // Verwenden Sie new, um Objekte zu erstellen, wenn für die Initialisierung KEINE Argumente erforderlich sind
  • NSString * someString = @ "Hallo, Welt!"; // NSString mit Literal-Syntax erstellen
  • NSNumber * myFloat = @ 3.14f; // Ein weiteres Beispiel zum Erstellen einer NSNumber mit Literal-Syntax
  • NSNumber * myInt = @ (84/2); // Ein Objekt mit einem geschachtelten Ausdruck erstellen

Klassen mit Initialisierungswerten erstellen

#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

Mit der Methode initWithMotorValue: type andChassisValue: type werden die Car-Objekte initialisiert.

Singleton-Klasse

Was ist eine Singleton-Klasse?

Eine Singleton-Klasse gibt dieselbe Instanz zurück, unabhängig davon, wie oft eine Anwendung sie anfordert. Im Gegensatz zu einer regulären Klasse bietet ein Singleton-Objekt einen globalen Zugriffspunkt auf die Ressourcen seiner Klasse.

Wann werden Singleton-Klassen verwendet?

Singletons werden in Situationen verwendet, in denen ein einzelner Steuerpunkt wünschenswert ist, z. B. bei Klassen, die allgemeine Dienste oder Ressourcen anbieten.

So erstellen Sie Singleton-Klassen

Erstellen Sie zuerst eine neue Datei und erstellen Sie eine Unterklasse von NSObject . CommonClass es irgendetwas, wir werden hier CommonClass . Xcode generiert jetzt CommonClass.h- und CommonClass.m-Dateien für Sie.

In Ihrer CommonClass.h Datei:

#import <Foundation/Foundation.h>

@interface CommonClass : NSObject {
}
+ (CommonClass *)sharedObject;
@property NSString *commonString;
@end

In Ihrer CommonClass.m Datei:

#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

So verwenden Sie Singleton-Klassen

Auf die Singleton-Klasse, die wir zuvor erstellt haben, kann von überall im Projekt aus CommonClass.h werden, solange Sie die CommonClass.h Datei in das entsprechende Modul importiert haben. Um auf die gemeinsam genutzten Daten in Singleton Class zuzugreifen und auf diese zuzugreifen, müssen Sie auf das gemeinsam genutzte Objekt dieser Klasse zugreifen, auf das Sie mit der sharedObject Methode wie folgt sharedObject :

[CommonClass sharedObject]

Gehen Sie folgendermaßen vor, um die Elemente in Shared Class zu lesen oder zu ändern:

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

Der Rückgabetyp "instancetype"

Objective-C unterstützt einen speziellen Typ namens `instancetype, der nur als von einer Methode zurückgegebener Typ verwendet werden kann. Sie wertet die Klasse des empfangenden Objekts aus.

Betrachten Sie die folgende Klassenhierarchie:

@interface Foo : NSObject

- (instancetype)initWithString:(NSString *)string;

@end

@interface Bar : Foo
@end

Wenn [[Foo alloc] initWithString:@"abc"] aufgerufen wird, kann der Compiler darauf schließen, dass der Rückgabetyp Foo * . Die von Foo abgeleitete Bar Klasse hat die Deklaration des Initialisierers nicht überschrieben. Dank instancetype kann der Compiler jedoch darauf schließen, dass [[Bar alloc] initWithString:@"xyz"] einen Wert vom Typ Bar * zurückgibt.

Betrachten Sie den Rückgabetyp von -[Foo initWithString:] , der stattdessen Foo * : Wenn Sie [[Bar alloc] initWithString:] würden, würde der Compiler darauf schließen, dass ein Foo * zurückgegeben wird, nicht ein Bar * wie es der Intention von Entwickler. Der instancetype Typ hat dieses Problem gelöst.

Vor der Einführung von instancetype müssen Initialisierer, statische Methoden wie Singleton-Accessoren und andere Methoden, die eine Instanz der empfangenden Klasse zurückgeben möchten, die zur Rückgabe einer id . Das Problem ist, dass id "ein Objekt jeglichen Typs" bedeutet . Der Compiler kann daher nicht feststellen, dass NSString *wrong = [[Foo alloc] initWithString:@"abc"]; wird einer Variablen mit einem falschen Typ zugewiesen.

Aus diesem Grund sollten Initialisierer immer instancetype anstelle von id als Rückgabewert verwenden.

Generics angeben

Sie können Ihre eigenen Klassen wie NSArray oder NSDictionary mit Generika NSDictionary .

@interface MyClass<__covariant T>

@property (nonnull, nonatomic, strong, readonly) NSArray<T>* allObjects;

- (void) addObject:(nonnull T)obj;

@end

Unterschied zwischen Zuordnung und Initialisierung

In den meisten objektorientierten Sprachen ist das Zuordnen von Speicher für ein Objekt und dessen Initialisierung eine atomare Operation:

// Both allocates memory and calls the constructor
MyClass object = new MyClass();

In Objective-C sind dies separate Operationen. Die Klassenmethoden alloc (und ihre historischen Geschwister allocWithZone: dass die Objective-C-Laufzeit den erforderlichen Speicher reserviert und löscht. Mit Ausnahme einiger interner Werte werden alle Eigenschaften und Variablen auf 0 / NO / nil .

Das Objekt ist dann bereits "gültig", aber wir möchten immer eine Methode aufrufen, um das Objekt tatsächlich einzurichten, das als Initialisierer bezeichnet wird . Diese haben denselben Zweck wie Konstruktoren in anderen Sprachen. Standardmäßig beginnen diese Methoden mit init . Aus sprachlicher Sicht sind dies nur normale Methoden.

// 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow