Sigo dándole vueltas al ObjectiveC, tengo que dejar atrás todos estos años de C++ y obligarme a pensar en ObjC para pillarle la esencia, la metodología para usar eficientemente este lenguaje.
Estaba dándole vueltas hoy a una técnica de optimización que se usa mucho en C++ llamada COW (Copy-on-write), o como la llama QT “Implicitly Shared Classes“. La esencia de esta técnica es que basándose en que una asignación de un objeto complejo ocupa tanto recursos de memoria como CPU, utiliza en lo posible copias compartidas (shared) en memoria y sólo se duplica la memoria del objeto cuando una instancia en concreto va a cambiar (va a escribirse en ella). Esta técnica no es propiedad exclusiva de C++, se usa tanto en memoria virtual de los sistemas operativos como en implementaciones de sistemas de ficheros (Ej. Ext3). En C++ los ejemplos clásicos son la clase “string” de la STL o los objetos de Qt. Se puede implementar fácilmente un objeto COW con un smart pointer, como la clase “auto_ptr” de la STL.
Toda esta discusión viene porque un smart pointer, como un “auto_ptr” es la forma que tiene C++ de atar, de encapsular el uso de la memoria para que, por una parte, no hayan errores con los punteros (memory leak) y por otra llevar un conteo de referencias para liberar la memoria cuando sea necesario (cuando ningún objeto “apunta” a un auto_ptr, éste libera la memoria automáticamente). Básicamente es un garbage collection, mejor bajo mi punto de vista. Con un auto_ptr sabes exactamente cuando se va a liberar la memoria: cuando el objeto pierde todas las referencias, ni antes ni después. Con un garbage collection como creo que usa C# y si no estoy equivocado también ObjectiveC, no tienes control sobre cuando se libera esa memoria. Usemos un ejemplo diferente, supongamos que el objeto que instanciamos usando un auto_ptr no es memoria, sino un recurso como un handle de fichero o un semáforo: a través de los constructores y destructores tenemos perfectamente controlado este recurso. Lo que quiero decir, y si algún “gurú” de ObjectiveC me lee por algún casual, es que me es extraño confiar en el mecanismo de [[obj alloc] init] / [obj dealloc] para la construcción y destrucción de objetos.