Was ist der zugrunde liegende Mechanismus für die IVAR -Synthese in der modernen Ziel -Laufzeit C.

StackOverflow https://stackoverflow.com/questions/275034

  •  07-07-2019
  •  | 
  •  

Frage

Eine der Funktionen der objektiven C -Laufzeit (64 -Bit -OS X und iPhone OS) ist die Fähigkeit, Ivars dynamisch dynamisch zu synthetisieren, ohne sie ausdrücklich in der Klasse zu deklarieren:

@interface MyClass : NSObject {
//  NSString *name; unnecessary on modern runtimes
}

@property (retain) NSStrng *name;

@end

@implementation MyClass

@synthesize name;

@end

In vieler Zeit verwenden ich benutzerdefinierte Getter -Implementierungen, um die Eigenschaften zu initialisieren:

- (NSString *) name {
  if (!name) {
    name = @"Louis";
  }

  return name;
}

Das obige ist mit synthetisierten IVARs unvereinbar, da es auf einen IVAR zugreifen muss, der nicht im Header deklariert ist. Aus verschiedenen Gründen möchte ich eine Reihe meiner persönlichen Frameworks aktualisieren, um synthetisierte IVARs zu verwenden, wenn ich auf den modernen Laufzeiten aufgebaut ist, muss der obige Code geändert werden, um mit synthetisierten IVARs zu arbeiten, um dieses Ziel zu erreichen.

Während die Dokumentation der objektiven C 2.0 feststellt, dass die synthetisierten Accessors in der modernen Laufzeit den IVAR bei der ersten Verwendung synthetisieren. Es gibt nicht an, welcher Mechanismus mit niedrigem Niveau dazu verwendet wird. Wird es von class_getInstancevariable () gemacht, sind die Einschränkungen auf class_addivar () gelöst, ist es eine undokumentierte Funktion in der objektiven C 2.0 -Laufzeit? Während ich meinen eigenen Seitenspeicher für die Daten implementieren konnte, die meine Eigenschaften unterstützen, würde ich den Mechanismus, der synthetisierte Zubehör verwendet, eher verwenden.

War es hilfreich?

Lösung

Ich habe mir gerade die Dokumentation angesehen, und ich denke, Sie können sie falsch interpretieren. Synthetisierte IVARs werden zur Kompilierungszeit erstellt, nicht zur Laufzeit.

Laut dem Objektiv-C 2.0-Dokumentation:

Es gibt Unterschiede im Verhalten, die von der Laufzeit abhängen (siehe auch „Laufzeitunterschiede“):

Für die Legacy -Laufzeiten müssen Instanzvariablen bereits im Block @Interface deklariert werden. Wenn eine Instanzvariable gleicher Name und kompatibler Typ wie die Eigenschaft vorliegt, wird sie verwendet - sonst erhalten Sie einen Compiler -Fehler.

Für die modernen Laufzeiten werden Instanzvariablen bei Bedarf synthetisiert. Wenn bereits eine Instanzvariable derselben Namen besteht, wird sie verwendet.

Sie müssen also nur die Instanzvariable deklarieren, die Sie benötigen, und der gleiche Code funktioniert auf beiden Laufzeiten ...

Andere Tipps

Was Sie suchen, ist @synthesized Name, wie:

@synthesize name = _name;

...

- (NSString *) name {
    if (!name) {
        _name = @"Louis";
    }

    return _name;
}

Sie fügen im Laufe der Laufzeit Eigenschaften mit dem hinzu NSKEYVALUECODING -Protokoll.

[myObject setValue:@"whatever" forKey:@"foo"];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top