NSString in Xamarin.iOS und Xamarin.Mac

Sowohl das Design von Xamarin.iOS als auch das von Xamarin.Mac erfordern die Verwendung einer API, um den nativen .NET-Zeichenfolgentyp string für die Zeichenfolgenbearbeitung in C# und anderen .NET-Programmiersprachen verfügbar zu machen und Zeichenfolgen nicht als Datentyp NSString, sondern als den von der API offengelegten Datentyp verfügbar zu machen.

Dies bedeutet, dass Entwickler Zeichenfolgen für den Aufruf in Xamarin.iOS & Xamarin.Mac API (Unified) nicht in einem speziellen Typ (Foundation.NSString) verwalten müssen, sondern weiterhin den System.String von Mono für alle Operationen verwenden können. Und falls eine API in Xamarin.iOS oder Xamarin.Mac eine Zeichenfolge benötigt, kümmert sich unsere API-Bindung um das Marshalling der Informationen.

Beispielsweise wird die Objective-C-Eigenschaft „text“ für ein UILabel-Objekt vom Typ NSString folgendermaßen deklariert:

@property(nonatomic, copy) NSString *text

In Xamarin.iOS erfolgt die Offenlegung wie folgt:

class UILabel {
    public string Text { get; set; }
}

Im Hintergrund führt die Implementierung dieser Eigenschaft zum Marshalling der C#-Zeichenfolge in ein NSString-Objekt, und die objc_msgSend-Methode wird auf die gleiche Weise aufgerufen, wie dies in Objective-C der Fall wäre.

Es gibt einige Objective-C-APIs von Drittanbietern, die anstelle von NSString eine C-Zeichenfolge (ein char) nutzen. In diesen Fällen können Sie weiterhin den C#-Zeichenfolgendatentyp verwenden, aber Sie müssen den Bindungsgenerator mit dem [PlainString]-Attribut darüber informieren, dass für diese Zeichenfolge kein Marshalling in einen NSString, sondern stattdessen in eine C-Zeichenfolge durchgeführt werden muss.

Ausnahmen von der Regel

Sowohl in Xamarin.iOS als auch in Xamarin.Mac gibt es Ausnahmen von dieser Regel. Die Entscheidung, wann wir string-Objekte und wann ausnahmsweise NSString-Objekte verfügbar machen, wird getroffen, wenn die NSString-Methode einen Zeigervergleich anstelle eines Inhaltsvergleichs durchführen kann.

Dies kann vorkommen, wenn eine Objective-C-API eine öffentliche NSString-Konstante als Token verwendet, die eine Aktion repräsentiert, statt die tatsächlichen Inhalte der Zeichenfolge zu vergleichen.

In diesen Fällen werden NSString-APIs verfügbar gemacht. Dies gilt für einige wenige APIs. Darüber hinaus werden Sie feststellen, dass NSString-Eigenschaften in einigen Klassen verfügbar gemacht werden. Diese NSString Eigenschaften werden für Elemente wie Benachrichtigungen verfügbar gemacht. Diese Eigenschaften sehen üblicherweise wie folgt aus:

class Foo {
     public NSString FooNotification { get; }
}

Benachrichtigungen sind Schlüssel, die für die NSNotification-Klasse verwendet werden, wenn Sie sich für ein bestimmtes Ereignis registrieren möchten, das von der Runtime übertragen wird.

Schlüssel sehen in der Regel ungefähr so aus:

class Foo {
     public NSString FooBarKey { get; }
}

Eine weitere Stelle, an der NSString-Elemente in der API verfügbar gemacht werden, sind Token, die als Parameter für bestimmte APIs in iOS oder OS X verwendet werden, die NSDictionary-Objekte als Parameter verwenden. Das Wörterbuch enthält typischerweise NSString-Schlüssel. Xamarin.iOS benennt diese statischen NSString-Eigenschaften per Konvention durch Hinzufügen des Namens „Key“.