Pregunta

¿Cuál es la mejor práctica para retener y soltar objetos pasan a los métodos de la clase?

Por ejemplo, si usted tiene una "variable de clase", declaró así:

static NSString *_myString = nil

...es la cosa correcta de hacer esto:

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

...que tiene el inconveniente de que la persona necesita para mantener un valor distinto de cero retener contar param para no ser lanzado antes de tiempo.Alternativamente, se podría hacer esto:

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

...que tiene el inconveniente de que sin un correspondiente nivel de clase dealloc la llamada que se fuga de memoria.O si el tipo de variable de clase en la argucia ser evitados completamente, tal vez con una clase singleton que administra la duración de este tipo de objetos en una forma más convencional?

Aquí están Apple docs en la creación de una instancia singleton.

El código que estoy trabajando es la muy hábil (y nuevo) el Objetivo de los Recursos del proyecto (http://www.iphoneonrails.com/).

¿Fue útil?

Solución

Retener y liberar, absolutamente. No es una fuga debido a que el único momento en que se llamaría dealloc de una clase es cuando termina el programa - momento en el que la memoria se liberará de todos modos. Hacerlo de la primera forma sería más molestia y va en contra de las directrices de gestión de la memoria de cacao.

En cuanto a si debe ser un método de clase o de un producto único: Clases a sí mismos por lo general no deben tener una gran cantidad de funcionalidad independiente. Ellos simplemente no fueron diseñados de esa manera en Objective-C, como se puede ver en la falta de variables de clase. Los métodos de clase deben tratar en general, con la creación y gestión de casos, ya veces el almacenamiento de propiedades compartidas o valores por defecto para todos los casos. La funcionalidad real de una clase debe entrar en las instancias. Esa es la convención en Objective-C.

(Por supuesto, no hay Objective-C Dios y que está libre de ignorar las convenciones, pero esa es la sabiduría general.)

Otros consejos

Además, en el caso de NSString o cualquier clase que tiene variantes mutables (como NSArray o NSDictionary), lo recomiendo encarecidamente copiar el parámetro en lugar de retenerlo. Si la cadena de la persona que llama que pasó fue un NSMutableString, su valor podría cambiar más tarde, y que va a cambiar en su clase también. Esto probablemente no es lo que quiere, así que aconsejo hacer esto:

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

El método copy hace una copia y establece la cuenta de retención a 1, por lo que ya está todo listo en cuanto a retención de la variable se refiere. Y, como un bono extra, si la persona que llama se pasa un <=>, que la clase es lo suficientemente inteligente para saber que su valor no puede cambiar, por lo que simplemente retiene en sí para evitar hacer una copia del objeto. Qué inteligente es eso?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top