2012-02-27 10 views
5

Estoy comenzando una nueva aplicación de Titanium y quiero utilizar las mejores prácticas y evitar fugas de memoria desde el principio. Soy nuevo en CommonJS y en la plataforma Titanium en general.Recomiende una estructura de proyecto de titanio con CommonJS

Desafortunadamente, parece que todas las aplicaciones de muestra para titanio envolvente en Ti.include("/lib/module") en lugar de newer recommended best practice de require("/lib/module").

Lo que me preocupa es el consumo de memoria del uso de CommonJS podría requerir. Desde el CommonJS Modules in Titanium documentation, indica que los módulos se almacenarán en la memoria caché, ¿no significaría esto que si alguna vez accedo a un módulo, todas esas funciones permanecen de repente en la memoria aunque se salgan del alcance?

he comenzado una nueva aplicación con la siguiente estructura

/ctrl   # Model/UI controllers 
/lib   # libraries (common + 3rd party) 
/ui    # UI forms 
/model   # DAL objects for data store 

Desde aquí mi aplicación principal tiene una vista única estilo tablero que está poco estructurada de la siguiente manera:

(function() { 
    var getMenuItem = require("/ui/main").getMenuItem; 
    var win = Titanium.UI.createWindow({ 
     title:'Main', 
     backgroundColor:'#fff' 
    }); 
    var nav = Ti.UI.iPhone.createNavigationGroup({ 
     window:win 
    }); 
    var sect; 
    var data = []; 
    sect = Ti.UI.createTableViewSection(); 
    data.push(sect); 
    sect.add(getMenuItem("Customers", 
     require("/ctrl/account").createCustMainWindow)); 
    sect.add(getMenuItem("Schedules", 
     require("/ctrl/schedule").createScheduleMainWindow)); 
    sect.add(getMenuItem("Settings")); 
    var menu = Titanium.UI.createTableView({ 
     style: Ti.UI.iPhone.TableViewStyle.GROUPED, 
     data:data 
    }); 
    win.add(menu); 
    menu.addEventListener('click',function(e) { 
     if (e.rowData.createWindow) { 
      var win = e.rowData.createWindow(nav); 
      nav.open(win); 
     } 
    }); 
    var navWindow = Titanium.UI.createWindow(); 
    navWindow.add(nav); 
    navWindow.open(); 
})(); 

Cualquier orientación sobre una estructura de proyecto correcta es muy apreciada.

Respuesta

2

This es la aplicación de la comunidad en desarrollo que únicamente utiliza el diseño del módulo, también mirar a través del blog de desarrolladores para encontrar forja series que tienen muestras desarrolladas en su mayoría con el patrón módulo

+0

Eso es perfecto, la estructura del proyecto es exactamente lo que estaba buscando. –

0

Uso require() y tengo un inicio largo de require() al comienzo del proyecto, que podría ser uno de los mayores proyectos de Titanium.

Y puedo estar seguro al decir que no hay un costo visible al poner miles de líneas de código en estas instrucciones. Sin embargo, debe comprobar constently que el código tiene no memory leaks.

0

AFAIK la memoria utilizada por el módulo CommonJS se libera cada vez que la ventana se cierra correctamente. A menos que asigne el módulo a un objeto global, en ese caso no sería una fuga.

Personalmente, creo una fábrica reutilizable. En realidad, depende de cuán compleja sea la aplicación, si solo hay un par de ventanas dentro de NavGroup, simplemente lo escribo directamente.

Y no te olvides de perfilar tu aplicación con los instrumentos Xcode para asegurarte de que tu aplicación no tenga fugas y, si lo hace, te ayudará a encontrar la fuga. Mire esto video for demo (aproximadamente 1/3 camino adentro).

+0

De acuerdo con los documentos, todos los módulos CommonJS están en caché. Probé esta teoría al crear un módulo de estado completo y referirme a ella en una ventana, cerré, deseché y abrí de nuevo, se retuvo el estado. Esto también se explica en la página de commonJS de appcelerator que los módulos están llenos de estado. https://wiki.appcelerator.org/display/guides/CommonJS+Modules+in+Titanium#CommonJSModulesinTitanium-Caching –

Cuestiones relacionadas