Curso de Iniciación a la Programación del iPhone SDK con Objective-C
Moncada, 9 de Julio de 2010
Memory Management
2
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'
3
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”];
4
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
5
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.
6
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
7
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
8
Demostración
9
Errores comunes
Fugas de memoria (leaks)
-(NSString *) proofMethod{
NSString *string = [[NSString alloc] initWithString:@”Hola”];
return string; //Fuga de memoria
}
10
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;
}
11
Errores comunes
Liberar objeto autorelease (Error)
-(void) proofMethod{
NSString *string = [NSString stringWithFormat:@”Hola %s”,[person name]];
[self setName:string];
[string release]; //Error
}
12
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
}
13
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
14
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];
}
}
15
Propiedades
Usando propiedades
Persona.h
@interface Person:NSObject
{
NSString *name;
}
@property (copy) NSString *name;
@end
Persona.m
@implementation
@synthesize name;
@end
16
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
17
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);
18
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
19
Notación punto (Dot Syntax)
-(void) setName:(NSString *)value
{
self.name = value;
}
¿Cuál es el problema?
20
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!
}
21
Bibliografía
“Objective-C 2.0 Programming Language”
“Memory Management Programming Guide for Cocoa”