2009-03-19 6 views
7

Si je déclare des variables de classe en Objective-C, quand la mémoire est-elle libérée?variables de classe objective-c: quand callloc est appelé?

Si mon interface est:

@interface TestClass : NSObject 
{ 
} 

+ (NSString)instanceCount; 

@end 

Et dans la mise en œuvre, je déclare:

static NSString instanceCount; 

Comment libérer cette variable de niveau de classe? c'est-à-dire quand le dealloc appelle-t-il des variables de classe dans Objective-C?

+3

Je suis juste tombé sur cette question tout en apprenant Obj-C. Apple semble suggérer qu'il n'existe pas de «variable de classe» et que ce que vous avez défini dans l'interface est plutôt une méthode * classe *, séparée de la variable statique et qui doit donc être définie dans l'implémentation. La variable statique est limitée à la portée du fichier d'implémentation *, et non à la classe elle-même. Peut-être que c'est un petit problème mais il m'a dérouté pendant une seconde: http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocObjectsClasses.html#//apple_ref/doc/ uid/TP30001163-CH11-TPXREF118 –

Répondre

10

La réponse courte à votre question est: "quand le programme se termine."

Les variables statiques sont allouées au tout début de votre programme, avant que la fonction main() ne commence. De même, ils seront publiés à la toute fin de votre programme, peu après sorties. Cette gestion de la mémoire est gérée par le runtime Objective-C, et tout se passe dans les coulisses.

Si vous essayez de surveiller ce comportement, vous n'aurez probablement pas beaucoup de chance. Par exemple, si vous avez fait ce qui suit dans une classe personnalisée, puis utilisé cette classe en tant que membre statique d'une autre classe:

- (void)dealloc 
{ 
    NSLog(@"I am being deallocated"); 
    [super dealloc]; 
} 

Vous ne verrez jamais ce message apparaît dans le journal. Il y a plusieurs raisons à cela. Premièrement, les variables requises par NSLog() peuvent déjà avoir été désallouées dans le cadre de la procédure d'arrêt normal. Et deux, parce que le système d'exécution peut simplement libérer toute la mémoire restante dans un seul coup, sans prendre la peine d'appeler les méthodes dealloc.

Cela peut être problématique si votre classe personnalisée fait quelque chose d'important dans sa méthode dealloc. Si c'est le cas, pensez à écrire une méthode personnalisée cleanup que vous appelez pour ces objets juste avant la fermeture du programme.

+0

ne pas mentionner le fait que dealloc est une méthode d'instance et pourrait être appelé 0 ou 100 fois pour la classe – cobbal

+0

Hmm, oui, mais je pensais à cette méthode dans un objet qui a été utilisé comme membre statique d'une autre classe. Je l'ai (je l'espère) éclairci dans ma réponse. Je vous remercie de le faire remarquer! –

Questions connexes