2011-11-06 5 views
0

Lors de l'introspection sur une classe, j'utiliser le code suivant:Objectif C Introspection

if([object isKindOfClass:[NSNumber class]]){ 

     NSLog(@"I am an NSNumber: %@", object); 
    } 

NSLog(@"Properties:%@", [object class]); 

La sortie est:

I am an NSNumber: 320 
Properties:__NSCFNumber 

Quelqu'un peut-il expliquer pourquoi le résultat est __NSCFNumber pour le type NSNumber? J'ai aussi remarqué NSArray est identifié comme:

__NSArrayI 

Répondre

6

NSNumber est un class cluster. NSNumber est la superclasse abstraite publique de plusieurs sous-classes de béton. Lorsque vous créez un NSNumber avec l'une des méthodes +numberWith..., vous obtiendrez une instance de l'une de ces sous-classes. Lorsque vous transmettez un objet à NSLog() en tant que paramètre correspondant à un spécificateur de stockage "% @", NSLog() envoie à cet objet un message -description et insère tout ce qui est renvoyé par cette expression dans la chaîne qu'il écrit dans le Descripteur de fichier stderr.

+1

En outre, j'imagine que '__NSCFNumber' dérive spécifiquement du pont sans frais entre' NSNumber' et 'CFNumber'. Des résultats similaires se produisent à partir de '[@" "class]' ('__NSCFString'). –

+1

Il y a aussi le "pont gratuit", qui représente le nom drôle de la classe NSCFNumber, puisque la même classe existe essentiellement dans l'environnement Objective-C (NS) et l'environnement Core Foundation (CF), et les deux peuvent être utilisés indifféremment . –

+0

Merci - c'est logique. Je viens d'un arrière-plan Java et C#, où c'est essentiellement comme "programmer vers l'interface" (si je comprends bien) – PhillyNJ

0

Je ne peux pas répondre directement à votre question, ce que je peux vous dire est que vous pouvez le faire:

[email protected]"Class name: %@.", NSStringFromClass([object class]); 

Et vous obtiendrez:

Class name: NSNumber. 

Cela vous aiderait-il?

4

__NSCFNumber est une sous-classe privée de NSNumber. Vous ne devriez pas avoir à vous soucier de la classe spécifique utilisée en interne, c'est un détail d'implémentation que le système d'exploitation utilise pour améliorer les performances.

Il existe un certain nombre de classes qui utilisent ce modèle (appelé Class Cluster), notamment NSString et NSArray.

Il n'est pas recommandé d'examiner trop profondément le type utilisé, car les types/implémentations peuvent (et changent) fréquemment. Juste le traiter comme NSNumber et vous devriez être très bien!