Gestión de la memoria y la propiedad al devolver un NSString de un método
-
10-10-2019 - |
Pregunta
Estoy escribiendo un método en Objective-C, que es para devolver una cadena basada en una entrada NSMutableArray. No tengo la intención de las personas que llaman a modificar la cadena, pero no me importa tampoco. la firma actual del método lee como:
- (NSMutableString *) generateString:(NSMutableArray *)myArray
El proyecto se encuentra actualmente una herramienta Fundación de línea de comandos con el fin de aprender las cuerdas, pero esto será en última instancia, terminan en una aplicación de iPhone.
Mis preguntas son:
- ¿Sería más prudente devolver un NSString?
2) Al devolver el NSMutableString debo usar autorelease? Si está recomendando puedo devolver un NSString ¿cómo se modifican devolverlo?
3) Si también quiero devolver un objeto de error identificar si se ha producido un error, tal vez una enumeración y una cadena, ¿cómo funciona la propiedad en ese caso? El método no se llama alloc, nueva o copiar Entonces, ¿cómo los conocimientos de llamadas? ¿Cómo voy a devolver el objeto de error asignado, además de la cadena en el método anterior?
Gracias!
Solución
- volvería un
NSString
en la mayoría de los casos. Tiene una superficie de memoria un poco más pequeño y si la persona que llama necesita una copia mutable, creando uno es sólo un método de distancia:.mutableCopy
- Usted no sólo debe pero Tiene a AutoRelease la
NSString
oNSMutableString
sus devuelve el método (al menos si el nombre de su método como en el ejemplo)! La Gestión de memoria Guía de Programación reglas listas que debe seguir para evitar un desastre completo y explica todo en profundidad. Así que leerlo! -
La Fundación marco utiliza la clase
NSError
para describir errores. Para "retorno" parámetros adicionales que su método podría tener este aspecto:- (NSString *)generateString:(NSMutableArray *)myArray error:(NSError **)error { BOOL failed; // Do some fancy stuff, if the operation fails, failed is true if (failed == YES) { if (error != NULL) { *error = [NSError errorWithDomain:@"your_domain" code:123 userInfo:nil]; } return nil; } return [yourString autorelease]; } // ... // Calling your method NSError *error = nil; [someObject generateString:someArray error:&error];
Tenga en cuenta que los dos **
y que cualquier NSError
var puede ser NULL
y no nil
(por lo que debe comprobar esto en el cuerpo del método).
Otros consejos
Por defecto métodos devuelven autorelease NSString, y me gustaría recomendar a utilizar el mismo comportamiento. Si se tendrá que modificar la cadena resultante, puede utilizar cadenas temporales.