2010-06-29 3 views
1

dans objc.h, il y a définition de cas de classeclasse dans la compréhension ObjectC

typedef struct objc_class *Class; 

typedef struct objc_object { 

    Class isa; 
} *id; 

: Classe d'emploi dans NSObject:

/*************** Basic protocols ***************/ 

@protocol NSObject 

- (BOOL)isEqual:(id)object; 
- (NSUInteger)hash; 

- (Class)superclass; 
- (Class)class; 
- (id)self; 

difficile à comprendre, si la classe est juste la structure, pas réel classe comme NSObject etc.

Quel est le but réel de la classe?

Répondre

0

Tous les comportements dynamiques du moteur d'exécution Objective-C sont disponibles en raison de la classe Class. Ce n'est pas une classe que vous aurez jamais sous-classer ou mettre en œuvre. Le moteur d'exécution remplit les métadonnées de votre classe auxquelles vous pouvez accéder pour l'introspection ou la modification.

langages tels que C++ et même Java ont un soutien très limité pour ce genre de chose. Objective-C est plus proche des langages de script Ruby ou Python à cet égard. Vous pouvez réellement remplacer les méthodes d'instance dans les classes existantes avec votre propre implémentation au moment de l'exécution et affecter la classe d'une autre manière que la plupart des langages compilés ne peuvent tout simplement pas toucher.

0

Je pense que vous êtes sur la mauvaise façon.

le fichier d'en-tête doit loook comme ceci:

#import <Foundation/NSObject.h> 

@interface Fraction: NSObject { 
    int numerator; 
} 

-(void) print; 
@end 

et la mise en œuvre (fichier .m) comme ce

#import "Fraction.h" 
#import <stdio.h> 

@implementation Fraction 
-(void) print { 
    printf("%i", numerator); 
} 
@end 

source

concernant

+0

Je ne suis pas sûr que vous avez bien lu la question - l'affiche veut connaître la fin de la classe. –

0

en Objective-C , les classes sont "first-class objects". Ils sont essentiels dans la vérification de type à l'exécution, par ex. pour vérifier si un objet est une chaîne que vous pouvez utiliser

[obj isKindOfClass:[NSString class]]; 

-isKindOfClass: doit accepter une classe Objective-C en tant que paramètre et Class est une représentation de celui-ci.

(Vous devez rarement prendre soin des définitions de type à objc.h sauf si vous devez manipuler l'exécution Objective-C en dessous du niveau de l'API C.)

0

classe permet au système d'exécution Objective-C savoir où chercher méthode tables (et variables d'instance etc.). En particulier, lorsque vous écrivez

[self foo: bar]; 

les appels système d'exécution

objc_msgSend(self, @selector(foo:), bar); 

puis il utilise le type d'auto pour trouver la bonne classe pour trouver la table de méthode appropriée pour trouver la mise en œuvre correspondant au message foo: . Et puis exécutez-le.

Questions connexes