NSString in Xamarin.iOS e Xamarin.Mac

La progettazione di Xamarin.iOS e Xamarin.Mac richiede l'uso dell'API per esporre il tipo di stringa .NET nativo, string, per la manipolazione delle stringhe in C# e altri linguaggi di programmazione .NET e per esporre string come tipo di dati esposto dall'API anziché dal NSString tipo di dati.

Ciò significa che gli sviluppatori non devono mantenere stringhe destinate a essere usate per chiamare l'API Xamarin.iOS & Xamarin.Mac (Unified) in un tipo speciale (Foundation.NSString), possono continuare a usare Mono per tutte le operazioni e ogni volta che un'API System.String in Xamarin.iOS o Xamarin.Mac richiede una stringa, l'associazione API gestisce il marshalling delle informazioni.

Ad esempio, la Objective-C proprietà "text" in un UILabel di tipo NSString, viene dichiarata come segue:

@property(nonatomic, copy) NSString *text

Questa operazione viene esposta in Xamarin.iOS come segue:

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

Dietro le quinte, l'implementazione di questa proprietà effettua il marshalling della stringa C# in un NSString oggetto e chiama il objc_msgSend metodo nello stesso modo che Objective-C lo farebbe.

Esistono alcune API di terze parti Objective-C che non usano un NSStringoggetto , ma usano invece una stringa C (un "char"). In questi casi, è comunque possibile usare il tipo di dati stringa C#, ma è necessario usare l'attributo [PlainString] per informare il generatore di associazioni che questa stringa non deve essere sottoposta a marshalling come stringa NSString, ma invece come stringa C.

Eccezioni alla regola

In Xamarin.iOS e Xamarin.Mac è stata apportata un'eccezione a questa regola. La decisione tra quando si espone stringe quando si effettua un'eccezione e si espone NSStrings, viene presa se il NSString metodo potrebbe eseguire un confronto puntatore anziché un confronto di contenuto.

Ciò può verificarsi quando un'API Objective-C usa una costante pubblica NSString come token che rappresenta un'azione, anziché confrontare il contenuto effettivo della stringa.

In questi casi, NSString le API vengono esposte e vi è una minoranza di API che lo hanno. Si noterà anche che le proprietà NSString vengono esposte in alcune classi. Tali NSString proprietà vengono esposte per elementi come le notifiche. Queste sono le proprietà in genere simili alle seguenti:

class Foo {
     public NSString FooNotification { get; }
}

Le notifiche sono chiavi usate per la classe quando si vuole eseguire la NSNotification registrazione per un determinato evento trasmesso dal runtime.

Le chiavi in genere hanno un aspetto simile al seguente:

class Foo {
     public NSString FooBarKey { get; }
}

Un'altra posizione in cui NSStringvengono esposti nell'API è come token usati come parametri per determinate API in iOS o OS X che accettano NSDictionary oggetti come parametri. Il dizionario contiene NSString in genere chiavi. Xamarin.iOS, per convenzione, assegna un nome alle proprietà statiche NSString aggiungendo il nome "Key".