Posts Tagged: apple


1
sep 09

Snow Leopard y Apple haciendo cosas raras

Dejemos las cosas claras: Apple no es la mega-super-guay empresa que muchos parece que quieren que sea. Es una empresa, y punto. Si acaso es de las mejores en cuanto a calidad y diseño, que ya es decir mucho.

Acabo de dar el paso definitivo a Mac OS X con un MacBook Pro que me he comprado para reemplazar mi equipo Vista de escritorio. Dicho con otras palabras, es la primera vez en 20 años que tengo un Mac exclusivamente.

Y una vez dicho esto, releo algo que ya sabíamos: OS X Snow Leopard sólo es para máquinas Intel de 64 bits. No va en PowerPC’s.

Esta frase que pasará desapercibida para la gran mayoría de usuarios de Mac (Dirán “Vale, ya lo sabíamos”), en el mundo PC es como si Microsoft decidiera que el próximo Windows 7 sólo funcionara en Intel Core 2 Duo o Xeon. Es decir, que se cargaría el 80% del mercado. No se qué cuota tendrán los Mac con procesador Intel, pero Apple tiene tan férreo control sobre el mercado de máquinas que se permite hacer esto.

Tengo que releer la frase y volver a pensar en ello, míralo con otras palabras: “A partir de aquí, o te compras una nueva máquina Apple o no podrás usar ningún programa!”. Quizás con Paralels o algún tipo de virtualización se podrían ejecutar aplicaciones PowerPC, pero vamos, coincidiréis que “no es lo mismo”.

A ver, no quiero que este post tenga connotaciones negativas exclusivamente, puede parecer que es una crítica. Pero leyendo entre líneas también hay algo de admiración. Ojalá otros pudieran hacer lo mismo. Estoy seguro que Vista o Windows 7 serían mucho mejores si Microsoft decidiera suspender el soporte para tecnologías obsoletas que llevan arrastrándose miles de años (en el universo informático, quiero decir).

Está claro que soy un admirador de Apple, no en vano me acabo de “convertir” ($$$), pero eso no quita para que sea crítico con algunas cosas de las que hace. Fanaticos Maqueros del mundo, os voy a decir como Pablo Motos: “Relaaaajate”. :-)


14
oct 08

iPhone y la programación con ObjectiveC

Hacía muchos años que no veía ObjectiveC. Cuando digo muchos, digo muuuchos. :-) No me equivocaría si dijera que aún estaba en venta el NeXT…

Ahora he vuelto a verlo por el iPhone. La verdad es que es la primera vez que me acerco en serio a la programación para OSX. No me acordaba desde mis tiempos de universidad, y de eso ha llovido un poco. Lo más que me acuerdo es que era en C y con un Classic… cuando era actual, jajaja.

Odio la programación en ObjectiveC. Puedo comprender las razones de Apple por elegir un lenguaje así en su época, pero no para mantenerlo. Es cierto que usar C/C++ para programación de entornos de usuario hay malos ejemplos, aunque se puede hacer bien, o hacer muy bien. También podía haber hecho su propio lenguaje, o ampliar uno ya existente. Ya puestos, por qué no usar directamente SmallTalk.

Dejemoslo claro, esto es una opinión personal. Si alguien lee esto que es defensor a ultranza de ObjectiveC le daré la razón. Simplemente quiero decir que no se piense que es una opinión de “Newbe”, llevo programando en entornos de usuario desde que me compré el número 1 del MSJ (Microsoft System Journal).

De hecho, lo malo no es el entorno de desarrollo, el Xcode lo considero fenomenal, un entorno de desarrollo que ya quisiera en Windows. No. Lo malo es con el lenguaje.

En cuanto a la sintaxis es lo de menos, al final te acostumbras aunque duramente por tantos años llamando a las funciones.con().parentesis(). Lo malo de la sintaxis de ObjectiveC es justamente lo lioso de leer y de entender para los no iniciados. Te [puedes [perder facilmente:@"en la" [maraña init]]]

Para mi lo peor es que es un lenguaje orientado a objetos sobre uno que no lo es, como C. Aunque en ObjectiveC++ se pueden mezclar clases de C++ con ObjectiveC, esto no arregla el problema. Esta diferencia de conceptos ha llevado a un lenguaje que no tiene constructores y destructores, no tiene sobrecarga de operadores ni polimorfismo, entre otras cosas.

Ahora que hay más movimiento en la programación ObjectiveC por el iPhone, se oyen voces de programadores contra el sistema, y se necesitan posts como este simplemente para decir cómo se tiene que construir un puto objeto en cocoa! Simplemente esto no me parece serio, y voy a dar una razón que creo de peso: no es de recibo que un lenguaje orientado a objetos, por mucho recolector de basura que tenga, sea tan propenso a equivocaciones.

El ejemplo de los constructores. En ObjectiveC no hay constructores ni destructores. Punto. Los objetos se inicializan si el programador se acuerda de hacerlo. Todo esto sin contar que toda la jerarquía de objetos que estás construyendo depende de que tu llames a [objeto init]. Me suena a tremendo WTF!. Si hablamos de destructores, la cosa se complica. Es el programador el que tiene que llamar a “dealloc” para destruir un objeto. No, espera, ¿o mejor llamar a “release”? Mmhh… Depende. Es a estas cosas a las que me refiero, el lenguaje no permite una construcción robusta de librerías. No basta con poner en negrita en rojo con fondo fosforito en la documentación: “Llama al puto release cuando quieras liberarme”, es la clase la que debería asegurarse de liberar sus recursos.

Me recuerdo ahora un post que leí en un blog, no recuerdo el nombre si no lo pondría, que venía a decir algo así con respecto a los destructores:

“En ObjectiveC no hace falta destruir un objeto, normalmente es más sencillo y mejor que el sistema operativo libere la memoria cuando sale del programa, excepto si el objeto tiene recursos ocupados como ficheros abiertos.”.

En resumiendo venía a decir algo así. Para mi mente tan Stroustruptiana, simplemente no cabe en la cabeza que algún programador (quizás yo mismo) me deje recursos sin liberar. Llamalo memoria, en tal caso viene la basura y me la recoje, pero llámalo fichero abierto, llámalo socket conectado o peor aún, llámalo semáforo activo y verás el problema.

Este es uno de los posts que iré poniendo conforme vaya descubriendo ObjectiveC, quizá los siguientes sean más compasivos, pero mientras tanto, y si vas a escribir un comentario negativo, resuelve esta cuestión:

¿Cual es la forma más correcta de inicializar un objeto?

Forma número 1:

1
2
3
4
5
6
- (id)init {
    if ((self = [super init])) {
        // inicializar el objeto.
    }
    return self;
}

Forma número 2:

1
2
3
4
5
- (id)init {
    if (![self init]) return nil;
 
    // Inicializar el objeto
}