Gestion de la memoria
Hola a todos, tengo una pregunta tecnica que me gustaria resolver para quedarme tranquilo. Estoy desarrollando una aplicacion en delphi para android y estoy utilizando el patrón arquitectónico "modelo-vista-controlador", aparentemente todo funciona, pero si he notado que cuando la app trabaja mucho la memoria ram del dispostivo se llena (aunque no considerablemente), lo que implica que no se esta liberando bien la memoria y particularmente tengo una duda:
tengo una clase modelo generica que crea un componente tsqlquery en tiempo de ejecucion, el controlador llama al modelo y este devuelve un tsqlquery cargado con la consulta pertinente, a continuacion el controlador delvuelve el tsqlquery al formulario(vista). Os pongo un ejemplo generico: <<vista>> type TForm2 = class(TForm) procedure FormShow(Sender: TObject); private sql:tsqlquery; public { Public declarations } end; implementation procedure TForm1.FormShow(Sender: TObject); var cliente:tcliente; begin cliente:= Tcliente.create; //esta funccion del controlador cliente carga el tsqlquery con la lista de clientes. cliente.listarcliente(sql); // una vez cargado la variable sql se realizan mas operaciones; end; < controlador cliente, funcion listar cliente > procedure TCliente.ListarClientes (var SQL: TSQLQUERY); var modelocliente: TModeloCliente; begin // cuando se ejecuta el contructor del modelo cliente, éste crea un tsqlquery y lo inicializa, el destrucctor de la clase libera dicho tsqlquery. modelocliente:=TModeloCliente.Create; // esta funcion devuelve el tsqlquery creado en el contructor y cargado con la consulta. SQL:= modeloCliente.ListarClientes(); end; Mi pregunta es, ¿ESTA ASIGNACION SE COPIA POR VALOR O POR REFERENCIA? SQL:= modeloCliente.ListarClientes(); Lo que si puedo decir es que una vez finalizada la funcion del controlador, el destructor del modelo cliente actua y libera el tsqlquery. Aun así la variable sql del formulario esta correctamente cargada y no esta liberada, lo que me hace pensar que es por copia o que no se esta liberado bien. El problema de la ram puede venir por ahí. cada vez que se crea el modelo se crea un nuevo tsqlquery, ¿se habra liberado el espacio reservado para el anterior? |
Cita:
Al liberar el Query, la variable SQL no se apunta a nil, a no ser que lo hagas manualmente. Si intentas hacer algo con va variable SQL seguramente obtendrás un access Violation, pues esa memoria a la que apunta ya ha sido liberada. |
Esta medio raro tu modelo de datos.
Lo que se ve a simple vista es que tenes una variable llamada "cliente" de tipo TCliente, es decir la variable "cliente" deberia representar solo UNO de los clientes de tu negocio, este deberia conocer su nombre, apellido, mail, y tener metodos como por ej. DeudaPendiente, UltimaCompraRealizada, ProductoMasComprado, etc. Recordar que es UNA instancia de TCLIENTE, siendo TCliente una estructura con metodos y atributos que tienen todos los clientes. Ahora para modelar comportamiento de varios clientes yo lo que hago es tener otra clase encargada de eso, por ej una TClientMgr o TClientHandler. Esta clase es la que se encarga de "pedirle" a la capa de acceso datos que me traiga la o las instancias de TCliente que necesito. Esta clase por ejmplo conoce metodos como ObtenerCliente(Id: integer): TCliente, ObtenerClientes(<parametros de busqueda>): TList<TCliente> y demases Es solo una sugerencia para tu codigo, tu pregunta ya la respondio Neftali |
Cita:
Si realmente es una asigancion de punteros, el ultimo showmessage deberia lanzarme un acess violation puesto que se ha liberado el espacio al que apunta, y para mi sorpresa me muestra el showmessage. ¿Porque?,¿Tal vez sea por como se gestiona la memoria en android?. De todas maneras así ha quedado el código final, que creo que es lo que te entendí. (Se han añadido las variables reales de la funcion): <Controlador cliente, Procedimiento ListarClientes >
< os pongo el codigo del constructor y del destructor, por sí aclara mas la situación >
No se si me habre explicado bien puesto que el tema no es facil de explicar, pero si necesitas de alguna función mas para su compresión por favor solicitamelo. Un saludo y muchisimas gracias |
Cita:
Lo tendré en cuenta para futuros proyectos, gracias |
Por favor, utiliza TAG's cuando escribas código Delphi.
|
Cita:
|
Gracias por su atención de momento se va a quedar así, seguire investigando de como puedo bajar la ram. gracias por todo
|
La franja horaria es GMT +2. Ahora son las 19:14:09. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi