2012-03-17 15 views
7

Me he estado preguntando por qué Apple usa tipos de datos en Core Foundation que se tipean como tipo de puntero mientras que en Cocoa no lo son.¿Por qué Apple anteriormente typedef tipos de referencia (puntero) pero ahora no?

Como ejemplo, haría referencia a un objeto UIColor como UIColor * mientras que una referencia a un objeto CGColor sería CGColorRef? O NSURL * y CFURLRef? ¿Por qué no usar siempre CGColor * y CFURL *? O, por el contrario, ¿por qué no hay tipos UIColorRef o NSURLRef, ya que nunca se accede a UIColor o NSURL directamente de todos modos?

O por ejemplo, ¿por qué es id y no id *, ya que en realidad se trata de un puntero y de hecho puede estar encasillado en void *?

Específicamente, ¿hay alguna razón por la cual Apple tenía la costumbre de hacer esto en sus marcos anteriores, pero dejó de hacerlo en Cocoa? ¿Es simplemente una cuestión de estilo?

+0

Cocoa (como NeXTStep) es en realidad anterior a Core Foundation. –

+0

Ahh No me di cuenta de eso. Siempre supuse que era el más nuevo. –

+0

Y en realidad, ahora que lo mencionas, me di cuenta de que era parte de NeXTStep, creo que estaba pensando en algo más nuevo como parte de los marcos de trabajo de Apple. –

Respuesta

8

Lo que Matt dijo, pero hay un poco más.

Los typedefs en las API basadas en C también permiten ocultar los detalles de implementación. Por ejemplo, puede tener lo siguiente sin definir la estructura __CFURL en un encabezado público.

typedef __CFURL *CFURLRef; 

Objective-C ha tenido durante mucho tiempo este tipo de características en forma de categorías y, recientemente añadido, la capacidad de mover las declaraciones de variables de instancia del archivo de cabecera. Espere que, con el tiempo, vea todas las variables de instancia eliminadas de los archivos de encabezado públicos en el SDK.

Tenga en cuenta que los frameworks Cocoa son de larga, larga y antigua fundación CoreFoundation.

En cuanto a por qué id se utiliza en lugar de id *, que se remonta a cuando Objective-C se creó por primera vez a principios de la década de 1980. Específicamente, la noción del lenguaje era que crearía "circuitos integrados de software" que podrían "enchufarse" como circuitos integrados reales. El objetivo era mantener las C bits como detalles de implementación e, idealmente, no expuestas en sus API.

En cuanto a por qué terminas con NSString * en lugar de NSString, eso se debe en gran parte a los fundamentos de C del lenguaje. Escribí un fairly detailed answer a una pregunta SO levemente diferente que es relevante.

Probablemente también encuentre this answer relevant, también.

+0

Wow, gran respuesta, gracias :) –

+0

Ah nice @bbum :-). Incluso iba a decir en mi respuesta "¡pero espera que @bbum hable"! Incluso traté de encontrar una respuesta, te juro que escribiste antes sobre 'id' vs' id * ', pero falló totalmente. Gran respuesta aquí sin embargo. – mattjgalloway

1

La razón de NSURL* contra CFURLRef es que es solo estilo de codificación. Cocoa es una API de Objective-C y el estilo general en Objective-C es no tener un typedef, mientras que Core Foundation es una API de C y su estilo general es usar un typedef. Es más o menos al estilo de codificación.

id vs id* - No estoy del todo seguro con eso, pero mi conjetura es que es histórico y que sólo quería tener la base de "objeto" a estar sin el *. Sin embargo, no estoy seguro de la historia de eso. Pero de nuevo solo será una cuestión de estilo.

Cuestiones relacionadas