Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010...

21
Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management

Transcript of Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010...

Page 1: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

Curso de Iniciación a la Programación del iPhone SDK con Objective-C

Moncada, 9 de Julio de 2010

Memory Management

Page 2: 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'

Page 3: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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”];

Page 4: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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

Page 5: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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.

Page 6: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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

Page 7: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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

Page 8: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

8

Demostración

Page 9: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

9

Errores comunes

Fugas de memoria (leaks)

-(NSString *) proofMethod{

NSString *string = [[NSString alloc] initWithString:@”Hola”];

return string; //Fuga de memoria

}

Page 10: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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;

}

Page 11: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

11

Errores comunes

Liberar objeto autorelease (Error)

-(void) proofMethod{

NSString *string = [NSString stringWithFormat:@”Hola %s”,[person name]];

[self setName:string];

[string release]; //Error

}

Page 12: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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

}

Page 13: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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

Page 14: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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];

}

}

Page 15: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

15

Propiedades

Usando propiedades

Persona.h

@interface Person:NSObject

{

NSString *name;

}

@property (copy) NSString *name;

@end

Persona.m

@implementation

@synthesize name;

@end

Page 16: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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

Page 17: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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);

Page 18: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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

Page 19: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

19

Notación punto (Dot Syntax)

-(void) setName:(NSString *)value

{

self.name = value;

}

¿Cuál es el problema?

Page 20: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

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!

}

Page 21: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management.

21

Bibliografía

“Objective-C 2.0 Programming Language”

“Memory Management Programming Guide for Cocoa”