You are on page 1of 21

Curso de Iniciacin a la Programacin del iPhone SDK con Objective-C

Memory Management

Moncada, 9 de Julio de 2010

Memoria

Creacin e inicializacin de objetos Alloc e init Memory Management Retain, release, copy, dealloc, autorelease Propiedades Parmetros de creacin Notacin 'punto'

Creacin e inicializacin

Mtodo alloc Mtodo de clase que guarda la memoria necesaria Mtodo init Mtodo de instancia que inicializa los valores de la variables y realiza otras tareas Pueden haber varios mtodos init en una clase (ms especficos con parmetros) 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, mtodo -dealloc

Memory Management

Cada objeto creado tiene un contador de referencias hacia l (retain count).

Al crear (con mtodo +alloc) un objeto, su contador vale 1


-retain y -copy incrementan el contador en 1 -release decrementa el contador en 1 En el mtodo -dealloc se liberan variables de instancia Cuando el contador llega a 0, el mtodo -dealloc se invoca automticamente (NUNCA MANUALMENTE), y libera el objeto.

Memory Management

Qu pasa con el siguiente mtodo? -(NSString *)returnString{ NSString *string = [[NSString alloc] initWithString:@Hola]; return string; //fuga de memoria } Solucin: NSAutoreleasePool

Autorelease Pool

Clase NSAutoreleasePool Pila de objetos a liberar NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Por convencin

TODOS los objetos construidos con mtodos que NO sean

Alloc, init, new o copy SON Autorelease

Demostracin

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]; //Mtodo autorelease return string;

}
-(NSString *) proofMethod{ NSString *string = [[NSString alloc] stringWithString:@Hola]; return string; }

10

Errores comunes

Liberar objeto autorelease (Error)


-(void) proofMethod{ NSString *string = [NSString stringWithFormat:@Hola %s,[person name]]; [self setName:string];

[string release]; //Error


}

11

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 }

12

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 Polticas de administracin de memoria

Uso de directivas @property y @synthesize

13

Propiedades

Antes de las propiedades

Mtodo GET
(NSString *)Name{ return varName;

Mtodo SET
(void)setName:(NSString *)value{ If (varName!=value){

}
} }

[varName release];
varName=[value copy];

14

Propiedades

Usando propiedades Persona.h @interface Person:NSObject { NSString *name; }


@property (copy) NSString *name;

Persona.m @implementation @synthesize name; @end

@end

15

Propiedades

Modificadores de las propiedades: Nonatomic: Si no hay problemas de concurrencia Assign: Crea un enlace dbil (weak link) Retain: Incrementa en 1 el retain count del objeto Copy: Realiza una copia del objeto readonly

16

Notacin punto (Dot Syntax)

Acceso a variables self.name = newString; [self setName: newString]; NSLog(@%s, [self name]); NSLog(@%s,self.name); es igual a es igual a

17

Notacin punto (Dot Syntax)

Acceso a variables self.name = newString; name = newString self.name = newString name = newString usa el mtodo SET acceso DIRECTO variable NO es igual a

Acceso directo SOLO en mtodo INIT y DEALLOC

18

Notacin punto (Dot Syntax)

-(void) setName:(NSString *)value { self.name = value; } Cul es el problema?

19

Notacin punto (Dot Syntax)

-(void) setName:(NSString *)value { self.name = value; } Es lo mismo que -(void) setName:(NSString *)value { [self setName:value]; // Bucle infinito!

20

Bibliografa

Objective-C 2.0 Programming Language Memory Management Programming Guide for Cocoa

21