210 likes | 340 Views
Curso de Iniciación a la Programación del iPhone SDK con Objective-C. Memory Management. Moncada, 9 de Julio de 2010. Memoria. Creación e inicialización de objetos Alloc e init Memory Management Retain, release, copy, dealloc, autorelease Propiedades Parámetros de creación
E N D
Curso de Iniciación a la Programación del iPhone SDK con Objective-C Memory Management Moncada, 9 de Julio de 2010
Memoria Creación e inicialización de objetos Alloc e init Memory Management Retain, release, copy, dealloc, autorelease Propiedades Parámetros de creación Notación 'punto'
Creación e inicialización Método alloc Método de clase que guarda la memoria necesaria Método init Método de instancia que inicializa los valores de la variables y realiza otras tareas Pueden haber varios métodos init en una clase (más específicos con parámetros) NSString *string = [[NSString alloc] initWithString:@”Hola”];
Memory Management En iPhone OS NO hay recolector de basura El programador es el encargado de liberar los recursos (llamadas balanceadas) Cada objeto en Objective-C tiene un destructor, método -dealloc
Memory Management Cada objeto creado tiene un contador de referencias hacia él (retain count). Al crear (con método +alloc) un objeto, su contador vale 1 -retain y -copy incrementan el contador en 1 -release decrementa el contador en 1 En el método -dealloc se liberan variables de instancia Cuando el contador llega a 0, el método -dealloc se invoca automáticamente (NUNCA MANUALMENTE), y libera el objeto.
Memory Management ¿Qué pasa con el siguiente método? -(NSString *)returnString{ NSString *string = [[NSString alloc] initWithString:@”Hola”]; return string; //fuga de memoria } Solución: NSAutoreleasePool
Autorelease Pool Clase NSAutoreleasePool Pila de objetos a liberar NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Por convención TODOS los objetos construidos con métodos que NO sean Alloc, init, new o copy SON Autorelease
Errores comunes Fugas de memoria (leaks) -(NSString *) proofMethod{ NSString *string = [[NSString alloc] initWithString:@”Hola”]; return string; //Fuga de memoria }
Errores comunes Fugas de memoria (Soluciones) -(NSString *) proofMethod{ NSString *string = [[NSString alloc] initWithString:@”Hola”]; [string autorelease]; //Método autorelease return string; } -(NSString *) proofMethod{ NSString *string = [[NSString alloc] stringWithString:@”Hola”]; return string; }
Errores comunes Liberar objeto autorelease (Error) -(void) proofMethod{ NSString *string = [NSString stringWithFormat:@”Hola %s”,[person name]]; [self setName:string]; [string release]; //Error }
Errores comunes Liberar objeto autorelease (Soluciones) -(void) proofMethod{ NSString *string = [NSString stringWithFormat:@”Hola %s”,[person name]]; [self setName:string]; } -(void) proofMethod{ NSString *string = [[NSString alloc] initWithFormat:@”Hola %s”,[person name]]; [self setName:string]; [string release]; //Bien. NSString con constructor INIT }
Propiedades Desde Objective-C 2.0 Proveen el acceso a los atributos del objeto Permiten indicar al compilador Permisos de acceso a variables de instancia Políticas de administración de memoria Uso de directivas @property y @synthesize
Propiedades Antes de las propiedades Método GET (NSString *)Name{ return varName; } Método SET (void)setName:(NSString *)value{ If (varName!=value){ [varName release]; varName=[value copy]; } }
Propiedades Usando propiedades Persona.h @interface Person:NSObject { NSString *name; } @property (copy) NSString *name; @end Persona.m @implementation @synthesize name; @end
Propiedades Modificadores de las propiedades: Nonatomic: Si no hay problemas de concurrencia Assign: Crea un enlace débil (weak link) Retain: Incrementa en 1 el retain count del objeto Copy: Realiza una copia del objeto readonly
Notación punto (Dot Syntax) Acceso a variables self.name = newString; es igual a [self setName: newString]; NSLog(@”%s”, [self name]); es igual a NSLog(@”%s”,self.name);
Notación punto (Dot Syntax) Acceso a variables self.name = newString; NO es igual a name = newString self.name = newString usa el método SET name = newString acceso DIRECTO variable Acceso directo SOLO en método INIT y DEALLOC
Notación punto (Dot Syntax) -(void) setName:(NSString *)value { self.name = value; } ¿Cuál es el problema?
Notación punto (Dot Syntax) -(void) setName:(NSString *)value { self.name = value; } Es lo mismo que -(void) setName:(NSString *)value { [self setName:value]; // ¡Bucle infinito! }
Bibliografía “Objective-C 2.0 Programming Language” “Memory Management Programming Guide for Cocoa”