2010-12-02 4 views
0

J'ai une classe de contrôleur X qui a une méthode d'occurrence IBAction, par exemple dosomething.Attribution et libération d'une classe

J'ai une autre classe Y qui fait des calculs et a un délégué.

Dans cette méthode dosomething une instance d'une classe Y est créée. Maintenant, où devrait être l'instance de Y libéré.Il @property est la seule solution pour cela.

// Cette action est en classe X

- (IBAction) DoSomething: expéditeur {

(id) Y * y = [[Y alloc] init]; La méthode // init est implémentée dans Y et fait un travail ainsi que ses délégués sont appelés de temps en temps. si nous lâchons y. ce serait un accident. alors où est l'endroit pour libérer y. Est @property la solution en créant une mémoire de temps et en utilisant cela. Y a-t-il un moyen de publier ceci uniquement lorsque la prochaine fois qu'un autre objet est créé plus ancien aurait été détruit avant seulement quand les délégués terminent leur travail après un certain temps.//

// [y release]; C'est un accident.

}

+1

Salut ashish. Juste quelques problèmes sémantiques: Une classe est allouée une seule fois, et elle n'est jamais "libérée" ou désallouée jusqu'à ce que le Runtime d'Objective-C soit retiré de la mémoire AFAIK. Donc, ce que vous vous demandez vraiment, c'est l'allocation et la libération des ** objets **, pas ** des classes **. Dans d'autres langues (en particulier celles qui modélisent des classes par prototypes), cette distinction est sans importance, mais en Objective-C, elle est incroyablement importante: la classe est aussi un objet, qui gère les caractéristiques des objets de lui-même. –

+0

Bonjour Jonathan merci. J'ai peu de doutes n'est-ce pas nécessaire? Si la classe est créée de telle façon qu'elle a ses objets dedans et que la classe dise que Y elle-même est un objet pour autre classe et maintenant il devient nécessaire de libérer la classe Y. être créé et détruit de Y dans X. – ashish

Répondre

0

Vous pouvez faire une chose,

// In the .h file 
// declare like this. 
Y *y; 

// In the .m file 

-(IBAction)dosomething:(id)sender { 

    if(y== nil) 
     y = [[Y alloc]init]; 

} 

et dans la méthode dealloc, vous pouvez libérer

- (void)dealloc{ 
    [y release]; 
    [super dealloc]; 
} 
+0

si cette méthode est appelée peu de fois - (IBAction) dosomething: (id) expéditeur à la fois. Ce ne sera pas le cas à ce moment-là, donc les nouvelles instances ne sont pas créées simultanément pour quelques occurrences de cette méthode. – ashish

0

il semble à moi, que la façon de résoudre plus facile la Le problème est d'appeler Y.delegate = nil dans Y dealloc et de vérifier si le Y.delegate == nil avant d'appeler l'une des méthodes Y.delegate.

0

Vous dites qu'un travail est fait dans la méthode init de la classe Y. Où certains délégués ont besoin de l'objet de Y jusqu'à ce que le travail soit terminé. Après quoi vous voulez libérer Y.

Donc ayez une propriété pour Y dans ce délégué et faites-la conserver. relâchez-le et réglez-le à zéro une fois votre travail terminé. Par conséquent, dans la méthode dosomething() de X, vous pouvez libérer immédiatement l'instance de Y. Ayez cette règle à l'esprit, quand X a besoin de Y pour vivre jusqu'à ce que son travail soit terminé, il doit juste en prendre possession.

C'est exactement la raison pour laquelle conserver count est maintenu dans Obj. C. Ainsi, un objet peut avoir plusieurs propriétaires. Lorsque tous ses propriétaires libèrent les objets, ils sont retirés de la mémoire.

+1

il y a n nombre de délégués dans la classe Y, donc je pense que le conserver chez les délégués ne sera pas faisable. – ashish

+0

Cela n'a pas d'importance en réalité .. chaque délégué peut conserver une retenue sur l'objet .. de sorte que retainCount sera égal au nombre de délégués. Et comme toute la sortie .. enfin l'objet sera libéré. –