2010-06-06 20 views
22

Tengo experiencia con Java y quiero aprender Object-C para escribir aplicaciones para el iPhone. ¿Cuáles son algunas diferencias fundamentales? (Aparte de sintaxis)Diferencia entre Object-C y Java

+19

Eres aplicación de java no es objeto de rechazo en cualquier momento incluso después de que sea aprobado por razones no publicados y subjetiva y selectiva administrados de forma aleatoria o ... ¿te refieres a los lenguajes de programación? :) –

+0

Eche un vistazo a http://stackoverflow.com/questions/2641210/how-big-of-a-jump-will-it-be-to-go-from-c-to-objective-c/2641358 # 2641358. No es exactamente Java vs. Objective-C, pero puede ser útil aún. –

+0

Estaba demasiado cansado para usar "su" frente a "usted" correctamente ... error :( –

Respuesta

2

La mayor diferencia que afectará de inmediato, además de un tipo completamente diferente conjunto de bibliotecas [1], es que Objective-C no proporciona el recolector de basura. Las bibliotecas de Apple proporcionan algunas rutinas y objetos relacionados con la recolección de basura, creo que usan el recuento de referencias, pero no tiene la recolección de basura a la que está acostumbrado en Java.

Aparte de eso, muchas cosas serán similares: herencia simple, encuadernación tardía, etc. El objetivo C no proporciona sobrecarga de método, pero esa es una diferencia algo trivial. Java y Objective-C no están muy separados en términos de cómo funciona su modelo de objetos. Obj. C tiene algunos trucos bajo su manga, como categorías, pero no necesita preocuparse por eso al principio.

Consulte el relacionado C# question sugerido por Remus para obtener más información (y mucho más detallada) (y gracias a Remus por recordarme la diferencia de la biblioteca, casi olvidé esa faceta importante).

29

En primer lugar, Objective-C no proporciona un recolector de basura para iPhone. En la Mac, un recolector de basura está presente.

Pero, Posiblemente la mayor diferencia para mí es que hay 2 archivos para cada clase. Un archivo de encabezado (.h) donde debe declarar variables de instancia, propiedades y métodos. Luego está el archivo de implementación (.m) donde escribe sus métodos. Las propiedades en Objective-C deben ser "sintetizadas" con la palabra clave @synthesize para crear los métodos getter y setter.

La transición no es tan mala. Ambos lenguajes siguen reglas similares en términos de modelos de objetos e incluso algo de la sintaxis. De hecho, hice la transición opuesta. Empecé con Objective-C para iPhone, luego elegí Java para desarrollar Android.

En una nota no relacionada, construir su UI es mucho más fácil usando las herramientas de Apple. El constructor de interfaz es extremadamente simple. Conectar los objetos de UI en los archivos de punta a sus declaraciones en código es muy fácil. Los instrumentos proporcionan una manera fácil de verificar el uso de CPU, fugas de memoria, asignaciones, etc. Además, solo en términos de características, pulido general y facilidad de uso, llevaré XCode y las herramientas de Apple a Eclipse en cualquier momento.

Si tiene "fluidez" en Java, el cambio a Objective-C no será demasiado difícil. ¡Simplemente prepare sus llaves [] y practique escribiendo "liberar"!

+0

Prefiero IntelliJ a Eclipse, y es mucho mejor que XCode. Supongo que AppCode sería mejor para iOS dev –

39

Conceptualmente, la mayor diferencia es que Objective-C se tipea dinámicamente y no se llaman a métodos, se envían mensajes. Esto significa que al tiempo de ejecución de Objective-C no le importa qué tipo es su objeto, solo si responderá a los mensajes que le envíe. Esto a su vez significa que podría (por ejemplo) crear una clase con un método objectForIndex: y usarla en lugar de un NSArray siempre que el código que lo utiliza solo llame a objectForIndex:

Esto le permite hacer todo tipo de cosas de elementos funky, como tener un objeto posar como un objeto de una clase diferente y agregar métodos en tiempo de ejecución o agregar colecciones de métodos (llamadas categorías) para crear previamente clases como NSString en tiempo de compilación. La mayoría de las veces nunca te molestarás con ninguno de esos trucos, excepto las categorías.

En un nivel más práctico que notará:

  • la sintaxis es diferente
  • gestión de memoria es más manual. En el iPhone, debe usar retener/liberar (OS X tiene recolección de basura). Esto no es realmente tan malo como parece. Si sigue the rules y ajusta sus variables de instancia en getters y setters, rara vez tendrá que escribir retener o liberar. Actualización: algún tiempo después de que escribí esto, Apple introdujo el recuento automático de referencias (ARC). ARC surgió de la observación de que el analizador estático clang era capaz de detectar casi todas las retenciones o liberaciones perdidas (o extra). Por lo tanto, extendieron el principio al hacer que el compilador ingrese y se libere automáticamente. Además de algunas reglas simples sobre relaciones fuertes y débiles (es decir, si un objeto afirma poseer o no otro objeto), puede olvidarse más o menos de la administración de la memoria. Además, ARC está disponible en iOS.
  • Todos los métodos son públicos. Esta es una consecuencia directa del paradigma de envío de mensajes, pero no puede definir métodos privados o protegidos.
  • La biblioteca es mucho más pequeña. En particular, notará que solo hay tres clases de colección NSArray, NSDictionary y NSSet (más sus versiones mutables). La filosofía es que programes a la interfaz. El tiempo de ejecución se preocupa por cuál debería ser la implementación.

ETA: Olvidé una cosa importante, la extrañarás de Java. Objective-C no admite espacios de nombre. Esta es la razón por la que verá clases OBjective-C con dos (o más) prefijos de letras y es la función que realmente me gustaría que agreguen.

+6

Hola , dijiste que "• Todos los métodos son públicos", estoy muy confundido acerca de esta afirmación, ya que pensé que podrías definir tus métodos privados en el archivo .m de implementación. Solo los métodos del archivo .h se tratan como clase pública. –

+3

@ TS.xy Sí puede declarar métodos en el archivo de implementación y marcará utiliza * fuera del archivo de implementación con una advertencia de compilación, pero el código se compilará y se ejecutará. No hay verificación en tiempo de ejecución para el uso de "privado" métodos. – JeremyP

+2

@JeremyP - es posible que desee actualizar esta publicación para analizar ARC. –

0

Cualquier objeto declarado en Objective C es un puntero de otro