Question

Quelle est la meilleure pratique pour retenir et libérer des objets passés aux méthodes de classe?

Par exemple, si vous avez une « variable de classe » déclarée comme ceci:

static NSString *_myString = nil

... est la bonne chose à faire:

+ (void)myClassMethod:(NSString *)param {
    _myString = param;
}

... qui présente l'inconvénient que l'appelant a besoin de maintenir un nombre non nul conserver sur de peur qu'il ne soit param libéré prématurément. En variante, on pourrait faire ceci:

+ (void)myClassMethod:(NSString *)param {
    [_myString autorelease];
    _myString = [param retain];
}

... qui présente l'inconvénient que, sans une classe de niveau correspondant dealloc appeler sera fuite de mémoire. Ou si cette sorte d'éviter chicaneries variable de classe complètement, peut-être avec une classe singleton qui gère la durée de vie de ces sortes d'objets d'une manière plus conventionnelle?

Voici docs d'Apple sur la création d'une instance singleton .

Le code que je travaille avec le très lisse (mais toujours nouveau) Objectif du projet des ressources ( http: / /www.iphoneonrails.com/ ).

Était-ce utile?

La solution

Conserver et la libération, tout à fait. Ce n'est pas une fuite, car le seul moment où la classe de dealloc serait appelé est lorsque le programme se termine - au cours de laquelle la mémoire sera libérée de toute façon. Le faire la première façon serait plus de tracas et va à l'encontre des directives de gestion de mémoire Cocoa.

Quant à savoir si elle doit être une méthode de classe ou un singleton: classes elles-mêmes ne devraient généralement pas avoir beaucoup de fonctionnalités indépendantes. Ils n'étaient pas conçus de cette façon en Objective-C, comme vous pouvez le voir sur l'absence de variables de classe. Les méthodes de classe doivent généralement faire face à la création et la gestion des cas, et parfois stocker des propriétés partagées ou valeurs par défaut pour tous les cas. La fonctionnalité réelle d'une classe devrait aller dans les instances. C'est la convention en Objective-C.

(Bien sûr, il n'y a pas de Dieu Objective-C et vous êtes libre d'ignorer les conventions, mais c'est la sagesse générale.)

Autres conseils

En outre, dans le cas de toute catégorie ou NSString qui a des variantes mutables (comme ou NSArray NSDictionary), je recommande fortement de copier le paramètre au lieu de le conserver. Si la chaîne l'appelant passé vous était un NSMutableString, sa valeur pourrait changer plus tard, et cela va changer dans votre classe ainsi. Ceci est probablement pas ce que vous voulez, je vous conseille de faire ceci:

+ (void)myClassMethod:(NSString *)param {
    [_myString release];
    _myString = [param copy];
}

La méthode fait une copie copy et définit le nombre que vous conserver à 1, donc êtes tous ensemble dans la mesure du maintien de la variable concernée. Et, comme un bonus supplémentaire, si l'appelant ne vous passez un <=>, cette classe est assez intelligent pour savoir que sa valeur ne peut pas changer, il se conserve simplement pour éviter de faire une copie de l'objet. Comment intelligent est-ce?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top