![Page 1: Curso de Iniciación a la Programación del iPhone SDK con Objective-C Moncada, 9 de Julio de 2010 Memory Management](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/1.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/2.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/3.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/4.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/5.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/6.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/7.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/8.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/9.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/10.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/11.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/12.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/13.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/14.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/15.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/16.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/17.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/18.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/19.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/20.jpg)
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](https://reader035.vdocuments.co/reader035/viewer/2022062623/5528bde5497959977d8fce61/html5/thumbnails/21.jpg)
21
Bibliografía
“Objective-C 2.0 Programming Language”
“Memory Management Programming Guide for Cocoa”