Le framework Foundation est le pain dans la boîte à outils d'un développeur iOS. Il fournit le NSObject
classe racine et un grand nombre de blocs de construction fondamentaux pour le développement iOS, des classes pour les nombres et les chaînes aux tableaux et dictionnaires. Le framework Foundation peut sembler un peu terne au début, mais il exploite beaucoup de puissance et est indispensable pour développer des applications iOS..
Dans l'article précédent, j'ai brièvement mentionné Core Foundation et ses relations avec Foundation. Même si nous n'utiliserons pas explicitement le framework Core Foundation dans le reste de cette série, il est judicieux de le connaître et de savoir en quoi il diffère du framework Foundation, que vous utiliserez fréquemment..
Alors que le framework Foundation est implémenté dans Objective-C, le framework Core Foundation est basé sur le langage C. Malgré cette différence, la structure Core Foundation implémente un modèle objet limité. Ce modèle d’objet permet de définir une collection de types opaques souvent appelés objets, malgré le fait qu’ils ne sont pas, à proprement parler, des objets..
L'objectif principal des deux frameworks est similaire, permettant le partage de données et de code entre les différentes bibliothèques et frameworks. Core Foundation inclut également un support pour l'internationalisation. Un élément clé de ce soutien est fourni par le biais de la CFString
type opaque, qui gère efficacement un tableau de caractères Unicode.
Comme je l'ai mentionné précédemment, le pontage sans frais réduit littéralement le pont entre les deux frameworks en permettant la substitution d'objets Cocoa aux objets Core Foundation dans les paramètres de fonction et inversement..
Il est important de noter que le comptage automatique des références (ARC) ne gère pas les "objets" Core Foundation, ce qui signifie que vous êtes responsable de la gestion de la mémoire lorsque vous utilisez des "objets" Core Foundation. Mike Ash a écrit un excellent article sur le comptage automatique des références et l'utilisation de l'ARC avec Core Foundation et du pontage sans frais..
Visitez la bibliothèque de développement Mac pour obtenir une liste complète des types opaques inclus dans le cadre Core Foundation..
Il est préférable d’apprendre une nouvelle compétence par la pratique. Créez donc un nouveau projet dans Xcode et sélectionnez le Outil de ligne de commande modèle de projet comme nous l'avons fait plus tôt dans cette série. Le modèle d’outil de ligne de commande se trouve dans la Application catégorie dans le OS X section. Cliquez sur Suivant continuer.
Nommez le nouveau projet Fondation et entrez un nom d'organisation et un identifiant d'entreprise. Pour ce projet, il est essentiel de définir le type de projet sur Fondation. Indiquez à Xcode où vous souhaitez enregistrer le projet et appuyez sur Créer.
Notre terrain de jeu pour le reste de cet article sera main.m et la fenêtre de la console Xcode. Ouvrir main.m en le sélectionnant dans le Navigateur de projet dans la barre latérale gauche et assurez-vous que la fenêtre de la console est visible en cliquant sur le bouton du milieu de la fenêtre. Vue contrôle dans la barre d'outils Xcode.
Clique le Courir bouton en haut à gauche pour construire et exécuter le schéma actuel. Si tout va bien, vous devriez voir Bonjour le monde! apparaît dans la fenêtre de la console en bas.
Le framework Foundation est beaucoup plus qu'une collection de classes permettant de travailler avec des nombres, des chaînes et des collections (tableaux, dictionnaires et ensembles). Il définit également des dizaines de protocoles, fonctions, types de données et constantes.
Dans la suite de cet article, je me concentrerai principalement sur les classes que vous utiliserez le plus souvent lors du développement d'applications iOS. Cependant, je parlerai aussi brièvement de trois protocoles clés définis par le cadre de la Fondation., NSObject
, NSCoding
, et NSCopying
.
Comme vous le savez déjà, le fichier d’en-tête d’une classe définit son interface. Cela signifie-t-il que vous devez importer le fichier d'en-tête de chaque classe Foundation que vous prévoyez d'utiliser? La réponse est oui et non.
Il est en effet nécessaire d'importer le fichier d'en-tête d'une classe avant de pouvoir l'utiliser. Vous le faites en ajoutant une instruction d'importation, comme nous l'avons vu précédemment dans cette série. Cependant, le cadre Foundation constitue un moyen pratique de faciliter ce processus. Le seul fichier que vous devez importer est Fondation.h comme indiqué dans l'extrait de code suivant.
#importation;
En coulisse, le framework Foundation importe tous les fichiers d'en-tête nécessaires pour vous donner accès à toutes les classes, protocoles, fonctions, types de données et constantes du framework Foundation..
Lorsque vous créez un nouveau projet dans Xcode et que vous définissez le type de projet sur Fondation, Xcode va:
Ouvrir main.m pour vérifier cela et développer le dossier frameworks dans le Navigateur de projet en cliquant sur le petit triangle à sa gauche. Je revisiterai le fichier d'en-tête précompilé et son objectif lorsque nous jetterons un coup d'œil au framework UIKit.
Plusieurs langages, tels que Perl, Python et C ++, prennent en charge l'héritage multiple, ce qui signifie qu'une classe peut descendre-être une sous-classe de plus d'une classe..
Même si Objective-C ne prend pas en charge l'héritage multiple, il prend en charge l'héritage multiple via la spécification sous la forme de protocoles. Qu'est-ce que ça veut dire? Au lieu d'hériter d'une classe, un protocole définit une liste de méthodes que les classes implémentent si elles sont conformes au protocole..
Un protocole peut avoir des méthodes obligatoires et optionnelles. Si une classe n'implémente pas toutes les méthodes requises d'un protocole, le compilateur lève une erreur.
Les avantages des protocoles sont multiples. Quand une classe adopte ou conforme à protocole, la classe est censée implémenter les méthodes (obligatoires) déclarées dans le protocole.
Les protocoles Objective-C sont très similaires aux interfaces en Java. Cela signifie qu'un protocole peut être utilisé pour déclarer l'interface à un objet sans révéler la classe de l'objet..
L'héritage multiple a ses avantages, mais il a certainement ses inconvénients. L'avantage des protocoles est que des classes non apparentées peuvent toujours partager un comportement similaire via l'utilisation de protocoles..
NSObject
En plus de NSObject
classe racine, le framework Foundation définit également un NSObject
protocole. Objets conformes à la NSObject
protocole peut être interrogé sur leur classe et leur super-classe, peut être comparé à d’autres objets et répondre à soi
comme nous l'avons vu dans l'article sur Objective-C. C’est seulement un petit sous-ensemble du comportement ajouté aux objets conformes à la NSObject
protocole.
NSCoding
Objets conformes à la NSCoding
protocole peut être encodé et décodé. Cela est nécessaire pour les objets devant être archivés ou distribués. L'archivage d'objet a lieu lorsqu'un objet ou un graphique d'objet est stocké sur le disque, par exemple.
NSCopying
le NSCopying
le protocole déclare une seule méthode, copyWithZone:
. Si une classe doit prendre en charge la copie d’objets, elle doit être conforme à la NSCopying
protocole. La copie d'un objet se fait en lui envoyant un message de copie
ou copyWithZone:
.
NSObject
le NSObject
classe est la classe racine de la grande majorité des hiérarchies de classes Objective-C. Vous souvenez-vous que nous avons instancié une instance du Livre
classe plus tôt dans cette série? Nous avons envoyé le Livre
classe un message de allouer
et nous avons envoyé à l'objet résultant un message de init
. Les deux méthodes sont déclarées dans le NSObject
classe.
En héritant de la NSObject
classe racine, les objets savent comment se comporter comme des objets Objective-C et comment s’interfacer avec le moteur d’exécution Objective-C. Ça ne devrait pas être une surprise que NSObject
conforme à la NSObject
protocole que nous avons vu plus tôt.
Retirer le NSLog
déclaration dans main.m et collez l'extrait de code suivant à sa place.
NSObject * myFirstObject = [[NSObject alloc] init]; NSLog (@ "Classe>% @", [classe MyFirstObject]); NSLog (@ "Superclass>% @", [superclasse myFirstObject]); NSLog (@ "Conforme au protocole>% i", [myFirstObject est conforme àProtocol: @protocol (NSObject)]);
Nous commençons par instancier une instance de NSObject
et stocker une référence dans le myFirstObject
variable. Dans la deuxième ligne, nous enregistrons le nom de classe du nouvel objet dans la console. le classe
méthode, retourne une instance de NSString
, un objet de chaîne, ce qui est la raison pour laquelle nous utilisons le % @
spécificateur de format dans le NSLog
déclaration.
Ensuite, nous demandons myFirstObject
pour sa superclasse et finissent par vérifier que myFirstObject
conforme à la NSObject
protocole. Êtes-vous confus par @protocol (NSObject)
? Ce n’est rien de plus qu’une référence à la NSObject
protocole.
Cliquez sur Courir et inspectez la sortie dans la fenêtre de la console. Êtes-vous surpris par la sortie? Parce que NSObject
est une classe racine, elle n'a pas de superclasse.
NSNumber
le NSNumber
class est une classe utilitaire qui gère l'un des types de données numériques de base. C'est une sous-classe du NSValue
classe, qui fournit un wrapper orienté objet pour les types scalaires ainsi que les pointeurs, structures et id d'objet. le NSNumber
La classe définit des méthodes pour récupérer la valeur qu'elle stocke, pour comparer des valeurs et pour récupérer une représentation sous forme de chaîne de la valeur stockée..
Gardez à l'esprit que la valeur extraite d'un NSNumber
instance doit être cohérente avec la valeur qui y était stockée. le NSNumber
La classe tentera de convertir de manière dynamique la valeur stockée dans le type demandé, mais il va sans dire qu’il existe des limitations inhérentes aux types de données NSNumber
peut gérer.
Laissez-moi illustrer ceci avec un exemple. Ajoutez l'extrait de code suivant à main.m.
NSNumber * myNumber = [NSNumber numberWithDouble: 854736e + 13]; NSLog (@ "Valeur double>% f", [myNumber doubleValue]); NSLog (@ "Valeur flottante>% f", [myNumber floatValue]); NSLog (@ "Int Value>% i", [myNumber intValue]);
Nous commençons par créer un nouveau NSNumber
par exemple en passant un double
valeur à numberWithDouble:
. Ensuite, nous récupérons la valeur stockée en utilisant trois différents NSNumber
méthodes. Les résultats ne reflètent pas la valeur stockée dans mon numéro
pour des raisons évidentes.
La leçon est simple, soyez cohérent lorsque vous utilisez NSNumber
en gardant une trace du type qui est stocké dans le NSNumber
exemple.
NSString
Exemples de NSString
classe gérer un tableau de unichar
caractères formant une chaîne de texte. La différence subtile mais importante avec une chaîne de Do régulière, qui gère carboniser
caractères, est-ce un unichar
caractère est un caractère multi-octets.
Comme son nom l'indique, un unichar
Le caractère convient parfaitement à la gestion des caractères Unicode. En raison de cette mise en œuvre, le NSString
classe fournit un support clé en main pour l'internationalisation.
Je tiens à souligner que la chaîne gérée par un NSString
l'instance est immuable. Cela signifie qu'une fois la chaîne créée, elle ne peut plus être modifiée. Les développeurs provenant d’autres langages, tels que PHP, Ruby ou JavaScript, peuvent être déroutés par ce comportement..
Le framework Foundation définit également une sous-classe modifiable de NSString
, NSMutableString
, qui peut être modifié après sa création.
Il existe différentes manières de créer des objets chaîne. Le moyen le plus simple de créer un objet chaîne consiste à appeler le chaîne
méthode sur le NSString
classe, qui retourne un objet chaîne vide. Regardez la référence de classe de NSString
pour une liste complète des initialiseurs.
Un autre chemin commun pour la création d'objets chaîne consiste à parcourir des littéraux de chaîne, comme illustré dans l'exemple ci-dessous. Dans cet exemple, une chaîne littérale est affectée à la un peu de corde
variable. Au moment de la compilation, le compilateur remplacera le littéral chaîne par une instance de NSString
.
NSString * string1 = @ "Ceci est un littéral de chaîne.";
le NSString
class a une multitude de méthodes d'instance et de classe pour créer et manipuler des chaînes et vous ressentirez rarement, le cas échéant, le besoin de sous-classe NSString
.
Explorons NSString
et sa sous-classe mutable, NSMutableString
, en ajoutant l'extrait suivant à main.m.
NSString * string1 = @ "Ceci est un littéral de chaîne."; NSString * string2 = [[NSString alloc] initWithFormat: @ "Les chaînes peuvent être créées de plusieurs manières."]; NSMutableString * mutableString = [[NSMutableString alloc] initWithString: string1]; [mutableString appendFormat: @ "% @", string2]; NSLog (@ "% @", mutableString);
Nous commençons par créer un objet chaîne en utilisant un littéral chaîne. Dans la deuxième ligne, nous créons une deuxième chaîne en utilisant l’un des initialiseurs spécialisés NSString
fournit. Une chaîne mutable est ensuite créée en transmettant la première chaîne en tant qu’argument. Pour illustrer que des chaînes mutables peuvent être modifiées après la création, chaîne2
est ajouté à la chaîne mutable et connecté à la fenêtre de la console.
NSArray
et NSSet
le NSArray
La classe gère une liste d'objets immuable et ordonnée. Le framework Foundation définit également une sous-classe modifiable de NSArray
, NSMutableArray
. le NSArray
classe se comporte très bien comme un tableau C avec la différence qu'une instance de NSArray
gère les objets. en outre, NSArray
déclare un large éventail de méthodes facilitant l'utilisation des tableaux, telles que les méthodes de recherche et de tri d'objets dans le tableau.
Il est important de comprendre que des exemples de NSArray
, NSSet
, et NSDictionary
ne peut stocker que des objets. Cela signifie qu'il n'est pas possible de stocker des types scalaires, des pointeurs ou des structures dans l'une de ces classes de collection (ou leurs sous-classes), le compilateur générant une erreur si vous le faites. La solution consiste à envelopper des types scalaires, des pointeurs et des structures dans une instance de NSValue
ou NSNumber
comme nous l'avons vu précédemment dans cet article.
Ajoutez l'extrait de code suivant à main.m explorer NSArray
et son homologue mutable, NSMutableArray
.
NSArray * myArray = [NSArray arrayWithObjects: @ "Pain", @ "Beurre", @ "Lait", @ "Oeufs", nil]; NSLog (@ "Nombre d'éléments>% li", [nombre de tableaux]); NSLog (@ "Object at Index 2>% @", [myArray objectAtIndex: 2]); NSMutableArray * myMutableArray = [NSMutableArray arrayWithObject: [NSNumber numberWithInt: 265]]; [myMutableArray addObject: [NSNumber numberWithInt: 45]]; NSLog (@ "Mutable Array>% @", myMutableArray);
Dans la première ligne, nous créons un tableau en utilisant le arrayWithObjects:
méthode de classe. Cette méthode accepte un nombre variable d'arguments-objets-avec le dernier argument étant néant
-qui n'est pas inclus dans le tableau. Dans les deuxième et troisième lignes, nous interrogeons le tableau sur le nombre d'objets qu'il contient et l'objet stocké à l'index 2
respectivement.
Parce que NSMutableArray
hérite de NSArray
, il se comporte de la même manière que NSArray
. La principale différence est que les objets peuvent être ajoutés et supprimés du tableau après sa création..
Avant de poursuivre, je voudrais dire quelques mots à propos de NSSet
. Cette classe est similaire à NSArray
, mais les différences principales sont que la collection d'objets gérée par un ensemble n'est pas ordonnée et que les doublons ne sont pas autorisés.
L'avantage de NSSet
est que l'interrogation de ses objets est plus rapide si vous avez seulement besoin de savoir si un objet est contenu dans l'ensemble. Le framework Foundation définit également NSOrderedSet
. Les instances de cette classe ont les avantages de NSSet
, mais aussi garder une trace de la position de chaque objet.
NSDictionary
Comme les tableaux, les dictionnaires sont un concept courant dans la plupart des langages de programmation. En Ruby, par exemple, ils sont appelés hachages. Le concept de base est simple, un dictionnaire gère une collection statique de paires clé-valeur ou d'entrées.
Comme dans les hachages Ruby, la clé d'une entrée ne doit pas nécessairement être un objet chaîne en soi. Il peut s'agir de tout type d'objet conforme à la NSCopying
protocole tant que la clé est unique dans le dictionnaire. Dans la plupart des cas, cependant, il est recommandé d'utiliser des objets chaîne comme clés.
Comme les tableaux, les dictionnaires ne peuvent pas stocker une valeur null. Si vous voulez représenter une valeur nulle, vous pouvez utiliser NSNull
. le NSNull
classe définit un objet singleton utilisé pour symboliser les valeurs NULL dans les tableaux, les dictionnaires et les ensembles..
Le modèle singleton est un modèle important dans de nombreux langages de programmation. Il limite l'instanciation d'une classe à un seul objet. Vous traiterez fréquemment avec des objets singleton lors du développement d'applications iOS.
Comme NSArray
, le cadre Foundation définit une sous-classe modifiable de NSDictionary
, NSMutableDictionary
. Il existe différentes manières d'instancier un dictionnaire. Regardez l'extrait de code suivant.
NSString * keyA = @ "myKey"; NSString * keyB = @ "myKey"; NSDictionary * myDictionary = [NSDictionary dictionaryWithObject: @ "Ceci est un littéral de chaîne" pourKey: keyA]; NSLog (@ "% @", [myDictionary objectForKey: keyB]);
Nous déclarons d’abord deux objets chaîne séparés contenant la même chaîne. Dans la troisième ligne, nous instancions un dictionnaire en appelant le dictionaryWithObject: forKey:
méthode sur le NSDictionary
classe.
Ensuite, nous demandons au dictionnaire l’objet associé au contenu de toucheB
et connectez-le à la console.
Il est important de faire attention aux détails. Même si nous avons utilisé cléA
en tant que clé de la paire clé-valeur et toucheB
en tant que clé permettant d'extraire la valeur ou l'objet de la paire clé-valeur, le dictionnaire nous a fourni le bon objet. le NSDictionary
la classe est assez intelligente pour savoir que nous voulons l'objet associé à une chaîne ma clé
. Qu'est-ce que ça veut dire? Même si les objets cléA
et toucheB
sont des objets différents, la chaîne qu'ils contiennent est la même et c'est précisément ce que le NSDictionary
classe utilise pour référencer l'objet.
Le fragment de code suivant montre qu'un dictionnaire peut contenir un autre dictionnaire, ou tableau, et indique également comment utiliser des dictionnaires mutables..
NSMutableDictionary * myMutableDictionary = [dictionnaire NSMutableDictionary]; [myMutableDictionary setObject: myDictionary forKey: @ "myDictionary"]; NSLog (@ "% @", myMutableDictionary);
Plus tôt dans cet article, je vous ai présenté les littéraux de chaîne Objective-C, tels que @ "Ceci est un littéral de chaîne."
. Ils prennent la forme d’un littéral de chaîne C préfixé par un @
signe. Comme vous le savez probablement maintenant, le @
le signe indique que nous entrons sur le territoire d'Objective-C.
Un littéral Objective-C n'est rien d'autre qu'un bloc de code faisant référence à un objet Objective-C. Avec la publication de Xcode 4.5, vous pouvez également utiliser les littéraux Objective-C pour NSNumber
, NSArray
, et NSDictionary
. Jetez un coup d'œil à l'extrait de code suivant pour voir comment cela fonctionne..
NSNumber * oldNumber1 = [NSNumber numberWithBool: YES]; NSNumber * newNubmer1 = @YES; NSNumber * oldNumber2 = [NSNumber numberWithInt: 2147]; NSNumber * newNubmer2 = @ 2147; NSArray * oldArray = [NSArray arrayWithObjects: @ "un", @ "deux", @ "trois", nil]; NSArray * newArray = @ [@ "un", @ "deux", @ "trois"]; NSDictionary * oldDictionary = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: 12345] forKey: @ "clé"]; NSDictionary * newDictionary = @ @ "key": @ 12345;
Les littéraux Objective-C sont non seulement cool et sexy, mais ils rendent également votre code plus lisible. Mark Hammonds a écrit un tutoriel sur les littéraux Objective-C. Lisez le post de Mark pour un aperçu plus complet des littéraux Objective-C.
NSLog
Dans cet article, nous avons utilisé à plusieurs reprises le NSLog
fonction définie par le framework Foundation. NSLog
accepte un nombre variable d'arguments, le premier argument étant un littéral de chaîne. Le littéral de chaîne peut contenir des spécificateurs de format qui sont remplacés par les arguments supplémentaires transmis à NSLog
une fonction.
NSLog (@ "% @ -% i -% f", @ "un objet", 3, 3.14);
Visitez la bibliothèque de développement Mac pour obtenir une liste complète des spécificateurs de format pouvant être utilisés..
Même si nous avons couvert beaucoup de sujets dans cet article, nous n’avons guère cerné ce que le cadre de la Fondation peut offrir..
Cependant, il n'est pas nécessaire de connaître les détails de chaque classe ou fonction définie dans l'infrastructure de Foundation pour se lancer dans le développement iOS. Vous en apprendrez plus sur le framework Foundation en explorant le SDK iOS..
Dans le prochain article, nous explorerons le framework UIKit et nous aborderons également les tenants et les aboutissants d'une application iOS..