1 / 21

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

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

lucian
Télécharger la présentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  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”

More Related