fbpx
Wikipedia

Objective-C

Objective-C es un lenguaje de programación orientado a objetos creado como un superconjunto de C para que implementase un modelo de objetos parecido al de Smalltalk. Originalmente fue creado por Brad Cox y la corporación StepStone en 1980. En 1988 fue adoptado como lenguaje de programación de NEXTSTEP y en 1992 fue liberado bajo licencia GPL para el compilador GCC. Actualmente se usa como un lenguaje principal de programación para Mac OS X, iOS y GNUstep, además de Swift.

Objective-C
?
Información general
Extensiones comunes h, m, mm y C
Paradigma orientado a objetos
Apareció en 1980
Diseñado por Brad Cox
Sistema de tipos fuerte, estático
Implementaciones numerosas
Influido por C, Smalltalk
Ha influido a Objective-C++, Java

Historia

A principios de los 80, el software se desarrollaba usando programación estructurada. La programación estructurada se estableció para ayudar a dividir los programas en pequeñas partes, haciendo más fácil el desarrollo cuando la aplicación se volvía muy grande. Sin embargo, como los problemas seguían creciendo al pasar el tiempo, la programación estructurada se volvió compleja dado el desorden de algunos programadores para invocar instrucciones repetitivamente, llevando a código spaghetti y dificultando la reutilización de código.

Muchos vieron que la programación orientada a objetos sería la solución al problema. De hecho, Smalltalk ya tenía solucionados muchos de estos problemas: algunos de los sistemas más complejos en el mundo funcionaban gracias a Smalltalk. Pero Smalltalk usaba una máquina virtual, lo cual requería mucha memoria para esa época, y era demasiado lento.

Objective-C fue creado principalmente por Brad Cox y Tom Love a inicios de los 80 en su compañía Stepstone. Ambos fueron iniciados en Smalltalk mientras estaban en el Programming Technology Center de ITT en 1981. Cox se vio interesado en los problemas de reutilización en el desarrollo de software. Se dio cuenta de que un lenguaje como Smalltalk sería imprescindible en la construcción de entornos de desarrollo potentes para los desarrolladores en ITI Corporation. Cox empezó a modificar el compilador de C para agregar algunas de las capacidades de Smalltalk. Pronto tuvo una extensión para añadir la programación orientada a objetos a C la cual llamó «OOPC» (Object-Oriented Programming in C). Love mientras tanto, fue contratado por Shlumberger Research en 1982 y tuvo la oportunidad de adquirir la primera copia de Smalltalk-80, lo que influyó en su estilo como programador.

Para demostrar que se hizo un progreso real, Cox mostró que para hacer componentes de software verdaderamente intercambiables solo se necesitaban unos pequeños cambios en las herramientas existentes. Específicamente, estas necesitaban soportar objetos de manera flexible, venir con un conjunto de bibliotecas que fueran utilizables, y permitir que el código (y cualquier recurso necesitado por el código) pudiera ser empaquetado en un formato multiplataforma.

Cox y Love luego fundaron una nueva empresa, Productivity Products International (PPI), para comercializar su producto, el cual era un compilador de Objective-C con un conjunto de bibliotecas potentes.

En 1986, Cox publicó la principal descripción de Objective-C en su forma original en el libro Object-Oriented Programming, An Evolutionary Approach. Aunque él fue cuidadoso en resaltar que hay muchos problemas de reutilización que no dependen del lenguaje, Objective-C frecuentemente fue comparado detalladamente con otros lenguajes.

Popularización mediante NeXT

En 1988, NeXT licenció el Objective-C de StepStone (el nuevo nombre de PPI, el dueño de la marca Objective-C) y extendió el compilador GCC para dar soporte a Objective-C, al mismo tiempo que desarrolló las librerías AppKit y Foundation Kit sobre las que se basaron la interfaz de usuario y la interfaz de creación de NeXTstep. Mientras que las estaciones de trabajo de NeXT no consiguieron hacer un gran impacto en el mercado, las herramientas fueron ampliamente alabadas en la industria. Esto llevó a NeXT a abandonar la producción de hardware y enfocarse en las herramientas de software, vendiendo NeXTstep (y OpenStep) como una plataforma para la programación a medida.

El trabajo para extender GCC fue liderado por Steve Naroff, que se unió a NeXT proveniente de StepStone. Los cambios del compilador fueron puestos a disposición bajo términos de licencia GPL, pero no las librerías de tiempo de ejecución, dejando la contribución de código abierto inutilizable para el público general. Esto llevó a que otras compañías desarrollaran esas librerías bajo licencias de código abierto. Más tarde, Steve Naroff fue también un colaborador principal al trabajo de Apple de construir la interfaz de Objective-C Clang.

El proyecto GNU comenzó a trabajar en su implementación de Cocoa como software libre, llamado GNUstep y basado en el estándar de OpenStep.[1]​ Dennis Glatting escribió el primer sistema en tiempo de ejecución de GNU Objective-C en 1992. El sistema GNU Objective-C, que ha sido usado desde 1993, es uno de los desarrollados por Kresten Krab Thorup cuando era un estudiante universitario en Dinamarca. Thorup también trabajó en NeXT desde 1993 hasta 1997.

Desarrollo de Apple y Swift

Tras adquirir NeXT en 1996, Apple empleó OpenStep en su nuevo sistema operativo, Mac OS X. Este incluía Objective-C y la herramienta de desarrollo basada en Objective-C de NeXT, Project Builder (que luego se ha expandido y ahora se conoce por Xcode), así como la herramienta de diseño de interfaz, Interface Builder. La mayoría de la actual Cocoa API de Apple está basada en objetos de interfaz de OneStep, y es el entorno de desarrollo de Objective-C más usado para desarrollo activo.

En la WWDC de 2014, Apple anunció planes para reemplazar a Objective-C en el desarrollo de Cocoa por el nuevo lenguaje Swift, que es llamado "Objective-C sin la C".

Sintaxis

Objective-C consiste en una capa muy fina situada por encima de C, y además es un estricto superconjunto de C. Esto es, es posible compilar cualquier programa escrito en C con un compilador de Objective-C, y también puede incluir libremente código en C dentro de una clase de Objective-C.

Esto es, para escribir el programa clásico "Hola Mundo" para correr en consola, se puede utilizar el siguiente código:

#import <stdio.h> int main( int argc, const char *argv[] ) {  printf( "Hola Mundo\n" );  return 0; } 

El código anterior se diferencia de un código en C común por la primera instrucción #import, que difiere del #include del C clásico, pero la función printf("") es puramente C. La función propia de Objective-C para imprimir una cadena de caracteres en consola es NSLog(@""); utilizándola, el código anterior quedaría de la siguiente manera:

int main( int argc, const char *argv[] )  {  NSLog( @"Hola Mundo\n" );  return 0; } 

La sintaxis de objetos de Objective-C deriva de Smalltalk. Toda la sintaxis para las operaciones no orientadas a objetos (incluyendo variables primitivas, pre-procesamiento, expresiones, declaración de funciones y llamadas a funciones) son idénticas a las de C, mientras que la sintaxis para las características orientadas a objetos es una implementación similar a la mensajería de Smalltalk.

Mensajes

El modelo de programación orientada a objetos de Objective-C se basa en enviar mensajes a instancias de objetos. Esto es diferente al modelo de programación al estilo de Simula, utilizado por C++ y esta distinción es semánticamente importante. En Objective-C uno no llama a un método; uno envía un mensaje, y la diferencia entre ambos conceptos radica en cómo el código referido por el nombre del mensaje o método es ejecutado. En un lenguaje al estilo Simula, el nombre del método es en la mayoría de los casos atado a una sección de código en la clase objetivo por el compilador, pero en Smalltalk y Objective-C, el mensaje sigue siendo simplemente un nombre, y es resuelto en tiempo de ejecución: el objeto receptor tiene la tarea de interpretar por sí mismo el mensaje. Una consecuencia de esto es que el mensaje del sistema que pasa no tiene chequeo de tipo: el objeto al cual es dirigido el mensaje (conocido como receptor) no está inherentemente garantizado a responder a un mensaje, y si no lo hace, simplemente lo ignora y retorna un puntero nulo.

Enviar el mensaje method al objeto apuntado por el puntero obj requeriría el siguiente código en C++:

obj->method(parameter); 

mientras que en Objective-C se escribiría como sigue:

[obj method:parameter]; 

Ambos estilos de programación poseen sus fortalezas y debilidades. La POO al estilo Simula permite herencia múltiple y rápida ejecución utilizando vinculación en tiempo de compilación siempre que sea posible, pero no soporta vinculación dinámica por defecto. Esto fuerza a que todos los métodos posean su correspondiente implementación, al menos que sean virtuales (aun así, se requiere una implementación del método para efectuar la llamada). La POO al estilo Smalltalk permite que los mensajes no posean implementación - por ejemplo, toda una colección de objetos pueden enviar un mensaje sin temor a producir errores en tiempo de ejecución. El envío de mensajes tampoco requiere que un objeto sea definido en tiempo de compilación. (Ver más abajo la sección tipado dinámico) para más ventajas de la ligadura dinámica.

Sin embargo, se debe notar que debido a la sobrecarga de la interpretación de los mensajes, un mensaje en Objective-C toma, en el mejor de los casos, tres veces más tiempo que una llamada a un método virtual en C++.[2]

Interfaces e implementaciones

Objective-C requiere que la interfaz e implementación de una clase estén en bloques de código separados. Por convención, la interfaz es puesta en un archivo cabecera y la implementación en un archivo de código; los archivos cabecera, que normalmente poseen el sufijo .h, son similares a los archivos cabeceras de C; los archivos de implementación (método), que normalmente poseen el sufijo .m, pueden ser muy similares a los archivos de código de C.

Interfaz

La interfaz de la clase es usualmente definida en el archivo cabecera. Una convención común consiste en nombrar al archivo cabecera con el mismo nombre de la clase. La interfaz para la clase Clase debería, así, ser encontrada en el archivo Clase.h.

La declaración de la interfaz de la forma:

@interface classname : superclassname {  // instance variables } +classMethod1; +(return_type)classMethod2; +(return_type)classMethod3:(param1_type)parameter_varName; -(return_type)instanceMethod1:(param1_type)param1_varName :(param2_type)param2_varName; -(return_type)instanceMethod2WithParameter:(param1_type)param1_varName andOtherParameter:(param2_type)param2_varName; @end 

Los signos más denotan métodos de clase, los signos menos denotan métodos de instancia. Los métodos de clase no tienen acceso a las variables de la instancia.

Si usted viene de C++, el código anterior es equivalente a algo como esto:

class classname : superclassname  {  public:  // instance variables    // Class (static) functions  static void* classMethod1();  static return_type classMethod2();  static return_type classMethod3(param1_type parameter_varName);    // Instance (member) functions  return_type instanceMethod1(param1_type param1_varName, param2_type param2_varName);  return_type instanceMethod2WithParameter(param1_type param1_varName, param2_type param2_varName = default); }; 

Note que instanceMethod2WithParameter demuestra la capacidad de nombrado de parámetro de Objective-C para la cual no existe equivalente directo en C/C++.

Los tipos de retorno pueden ser cualquier tipo estándar de C, un puntero a un objeto genérico de Objective-C, o un puntero a un tipo específico así como NSArray *, NSImage *, o NSString *. El tipo de retorno por defecto es el tipo genérico id de Objective-C.

Los argumentos de los métodos comienzan con dos puntos seguidos por el tipo de argumento esperado en los paréntesis seguido por el nombre del argumento. En algunos casos (por ej. cuando se escriben APIs de sistema) es útil agregar un texto descriptivo antes de cada parámetro.

-(void) setRangeStart:(int)start End:(int)end; -(void) importDocumentWithName:(NSString *)name withSpecifiedPreferences:(Preferences *)prefs beforePage:(int)insertPage; 

Implementación

La interfaz únicamente declara la interfaz de la clase y no los métodos en sí; el código real es escrito en la implementación. Los archivos de implementación (métodos) normalmente poseen la extensión .m.

@implementation classname +classMethod {  // implementation } -instanceMethod {  // implementation } @end 

Los métodos son escritos con sus declaraciones de interfaz. Comparando Objective-C y C:

-(int)method:(int)i  {  return [self square_root: i]; } 
int function(int i)  {  return square_root(i); } 

La sintaxis admite pseudo-nombrado de argumentos.

-(int)changeColorToRed:(float)red green:(float)green blue:(float)blue [myColor changeColorToRed:5.0 green:2.0 blue:6.0]; 

La representación interna de este método varía entre diferentes implementaciones de Objective-C. Si myColor es de la clase Color, internamente, la instancia del método -changeColorToRed:green:blue: podría ser etiquetada como _i_Color_changeColorToRed_green_blue. La i hace referencia a una instancia de método, acompañado por los nombres de la clase y el método, y los dos puntos son reemplazados por guiones bajos. Como el orden de los parámetros es parte del nombre del método, éste no puede ser cambiado para adaptarse al estilo de codificación.

De todos modos, los nombres internos de las funciones son raramente utilizadas de manera directa, y generalmente los mensajes son convertidos a llamadas de funciones definidas en la librería en tiempo de ejecución de Objective-C – el método que será llamado no es necesariamente conocido en tiempo de vinculación: la clase del receptor (el objeto que envió el mensaje) no necesita conocerlo hasta el tiempo de ejecución.

Instanciación

Una vez que una clase es escrita en Objective-C, puede ser instanciada. Esto se lleva a cabo primeramente alojando la memoria para el nuevo objeto y luego inicializándolo. Un objeto no es completamente funcional hasta que ambos pasos sean completados. Esos pasos típicamente se logran con una simple línea de código:

MyObject * o = [[MyObject alloc] init]; 

La llamada a alloc aloja la memoria suficiente para mantener todas las variables de instancia para un objeto, y la llamada a init puede ser anulada para establecer las variables de instancia con valores específicos al momento de su creación. El método init es escrito a menudo de la siguiente manera:

-(id) init  {  self = [super init];  if (self)   {  ivar1 = '''value1''';  ivar2 = value2;  .  .  .  }  return self; } 

Protocolos

Objective-C fue extendido en NeXT para introducir el concepto de herencia múltiple de la especificación, pero no la implementación, a través de la introducción de protocolos. Este es un modelo viable, ya sea como una clase base abstracta multi-heredada en C++, o como una "interfaz" (como en Java o C#). Objective-C hace uso de protocolos ad-hoc, llamados protocolos informales, y el compilador debe cumplir los llamados protocolos formales.

Tipado dinámico

Objective-C, al igual que Smalltalk, puede usar tipado dinámico: un objeto puede recibir un mensaje que no está especificado en su interfaz. Esto se permite para incrementar la flexibilidad, ya que permite a un objeto "capturar" un mensaje y enviarlo a otro objeto diferente que pueda responder a ese mensaje apropiadamente, o del mismo modo reenviar el mensaje a otro objeto. Este comportamiento es conocido como reenvío de mensajes o delegación (ver más abajo). Alternativamente, un manejo de error puede ser usado en caso de que el mensaje no pueda ser reenviado. Si un objeto no reenvía un mensaje, lo responde o maneja un error entonces el sistema generará una excepción en tiempo de ejecución. Si los mensajes son enviados a nil (el puntero de objetos nulo), serán ignorados silenciosamente o elevarán una excepción genérica, dependiendo de las opciones del compilador.

La información tipada estáticamente puede ser añadida opcionalmente a variables. Esta información es luego comprobada a la hora de compilar. En las siguientes cuatro declaraciones se proveen tipos de información crecientemente específicos. Estas declaraciones son equivalentes en el tiempo de ejecución, pero la información adicional permite al compilador el avisar al programador si el argumento pasado no encaja con el tipo especificado.

- (void)setMyValue:(id)foo; 

En la declaración anterior, foo puede ser de cualquier clase.

- (void)setMyValue:(id<NSCopying>)foo; 

En la declaración anterior, foo puede ser una instancia de cualquier clase que satisfaga al protocolo NSCopying.

- (void)setMyValue:(NSNumber *)foo; 

En la declaración anterior, foo debe ser una instancia de la clase NSNumber.

- (void)setMyValue:(NSNumber<NSCopying> *)foo; 

En la declaración anterior, foo debe ser una instancia de la clase NSNumber, y debe satisfacer al protocolo NSCopying.

Reenvío

Objective-C permite el envío de un mensaje a un objeto que puede no responder. En lugar de responder o simplemente ignorar el mensaje, un objeto puede reenviar el mensaje a otro objeto que pueda responderlo. El reenvío puede ser usado para simplificar la implementación de ciertos patrones de diseño, como el observer o el proxy.

El tiempo de ejecución de Objective-C especifica un par de métodos en Object:

  • métodos de reenvío:
- (retval_t)forward:(SEL)sel args:(arglist_t)args; // con GCC - (id)forward:(SEL)sel args:(marg_list)args; // con sistemas NeXT/Apple 
  • métodos de acción:
- (retval_t)performv:(SEL)sel args:(arglist_t)args; // con GCC - (id)performV:(SEL)sel args(marg_list)args; // con sistemas NeXT/Apple 

Un objeto que desee implementar el reenvío solamente necesita sobreescribir el método de reenvío con un nuevo método que defina el comportamiento de reenvío. El método de acción performv:: no necesita ser sobreescrito, ya que este método meramente realiza una acción basada en el selector y los argumentos. El tipo SEL es el tipo de mensajes en Objective-C.

Nota: en openStep, Cocoa y GNUstep, los espacios de trabajo de Objective-C comúnmente usados, no hay que usar la clase Object. el método - (void)forwardInvocation:(NSInvocation *)anInvocation de la clase NSObject es usado para realizar el reenvío.

Ejemplo

Aquí hay un ejemplo de un programa que demuestra las bases del reenvío.

Forwarder.h
# import <objc/Object.h> @interface Forwarder : Object {  id recipient; // El objeto al que queremos reenviar el mensaje. } // Métodos de acceso - (id)recipient; - (id)setRecipient:(id)_recipient; @end 
Forwarder.m
# import "Forwarder.h"   @implementation Forwarder   - (retval_t)forward:(SEL)sel args:(arglist_t) args {  /*  * Comprueba si el receptor responde al mensaje.  * Esto puede ser o no deseable, por ejemplo, si un receptor  * a su vez no responde el mensaje, podría reenviarlo él mismo.  */  if([recipient respondsToSelector:sel]) {  return [recipient performv:sel args:args];  } else {  return [self error:"El receptor no responde"];  } }   - (id)setRecipient:(id)_recipient {  [recipient autorelease];  recipient = [_recipient retain];  return self; }   - (id) recipient {  return recipient; } @end 
Recipient.h
# import <objc/Object.h>   // Un simlpe objeto receptor. @interface Recipient : Object - (id)hola; @end 
Recipient.m
# import "Recipient.h"   @implementation Recipient   - (id)hola {  printf("El receptor dice hola!\n");    return self; }   @end 
main.m
# import "Forwarder.h" # import "Recipient.h"   int main(void) {  Forwarder *forwarder = [Forwarder new];  Recipient *recipient = [Recipient new];    [forwarder setRecipient:recipient]; // Elige el receptor.  /*  * Véase que el reenviante no ersponda al saludo! Será reenviado.  * Todos los métodos no reconocidos serán reenviados al receptor  * (si el receptor los responde, como se dice en el Forwarder)  */  [forwarder hello];    [recipient release];  [forwarder release];    return 0; } 

Notas

Cuando se compila con gcc, el compilador reporta:

$ gcc -x objective-c -Wno-import Forwarder.m Recipient.m main.m -lobjc

main.m: In function `main':

main.m:12: warning: `Forwarder' no responde a `hola'

$

El compilador reporta lo comentando antes, que Forwarder no responde a mensajes hola. En esta circunstancia, es seguro ignorar el aviso ya que el reenvío fue implementando. La ejecución del programa produce esta salida:

& ./a.out

El receptor dice hola!

Variantes del lenguaje

Objective-C++

Objective-C++ es una variante del lenguaje aceptada por la interfaz del GNU Compiler Collection y Clang, que puede compilar archivos de código fuente que usen una combinación de sintaxis de C++ y Objective-C. Objective-C++ añade a C++ las extensiones que Objective-C añade a C. Como no se hace nada para unificar la semántica detrás de las características de varios lenguajes, existen ciertas restricciones:

  • Una clase de C++ no puede derivar de una clase de Objective-C y viceversa.
  • Espacios de nombres de C++ no pueden ser declarados dentro de una declaración de Objective-C.
  • Las declaraciones de Objective-C deben aparecer de manera global, no dentro de una declaración de C++.
  • Las clases de Objective-C no pueden tener instancias variables de clases de C++ que no tengan un constructor por defecto o que tengan uno o más métodos virtuales, pero los punteros a objetos de C++ pueden ser usados como instancias variables sin restricción (se asignan en el método -init).
  • Las semánticas "por valor" de C++ no pueden ser aplicadas a objetos de Objective-C, que solamente son accesibles mediante punteros.
  • Una declaración de Objective-C no puede estar dentro de una plantilla de declaración de C++ y viceversa. Sin embargo, los tipos de Objective-C (como Classname *) pueden ser usados como parámetros de plantillas de C++.
  • El manejo de excepciones de Objective-C y C++ es distinto; cada lenguaje solamente puede manejar excepciones propias. Esto es mitigado en recientes versiones o bien reemplazando completamente las exceptiones de Objective-C por excepciones de C++ (como hace Apple), o parcialmente cuando está enlacada la librería de Objective-C++ (GNUstep libobjc2).
  • Hay que tener cuidado ya que las llamadas al destructor de las excepciones en tiempo de ejecución de Objective-C y C++ no coinciden (por ejemplo, un destructor de C++ no será llamado cuando una excepción de Objective-C sale del alcance de un objeto de C++). Las nuevas versiones de 64 bits solucionan esto mediante la introducción de interoperabilidad con las excepciones de C++ en este sentido.[3]
  • Los blocks de Objective-C y las lambdas de C++11 son entidades distintas, sin embargo un block es generado transparentemente en Mac OS X cuando se pasa una lambda donde se espera un block.[4]

Objective-C 2.0

En la Worldwide Developers Conference de 2006, Apple anunció el lanzamiento de "Objective-C 2.0", una revisión del lenguaje Objective-C para incluir "una recolección de basura moderna, mejoras de sintaxis,[5]​ perfeccionamiento de la ejecución[6]​ y soporte para 64 bits". Mac OS X v10.5, lanzado en octubre de 2007, incluía un compilador de Objective-C 2.0. GCC 4.6 soporta muchas aplicaciones nuevas de Objective-C, como las propiedades declaradas y sintetizadas, sintaxis de puntos, enumeración rápida, métodos de protocolo opcionales, atributos de método/protocolo/clase, extensiones de clase y una nueva API de GNUnn Objective-C.[7]

Recolección de basura

Objective 2.0 contaba con un recolector de basura conservativo opcional. Cuando se ejecutaba en modo de retrocompatibilidad, cambiaba las operaciones de conteo de referencias como "retener" y "liberar" en NOPs (No operaciones, instrucción de ensamblador que indica que el procesador no tiene que hacer nada). Todos los objetos eran sometidos al recolector de basura cuando la recolección de basura estaba habilitada. Los punteros de C podían ser cualificados con "__strong" para provocar la intercepción de escritura del compilador y así participar en la recolección de basura.[8]​ Un subsistema débil de puesta a cero también era provisto de tal manera que los punteros marcados con "__weak" eran puestos a cero cuando el objeto (o más fácilmente, la memoria del recolector de basura) es recolectado. El recolector de basura no existía en la implementación de Objective-C 2.0 de iOS.[9]​ La recolección de basura en Objective-C se ejecuta en un hilo de baja prioridad y puede detener eventos del usuario, con la intención de mantener la experiencia del usuario receptiva.[10]

La recolección de basura nunca estuvo disponible en iOS debido a problemas de rendimiento. Fue despreciado en la versión 10.8 de OS X en favor del Conteo de Referencias Automático (en inglés: Automatic Reference Counting, ARC) y está programado que se elimine en una futura versión de OS X.[11]​ Objective-C en iOS 7 ejecutado en ARM64 usa 19 bits de una palabra de 64 bits para almacenar el conteo de referencias, como una forma de puntero etiquetado.[12][13]

Propiedades

Objective 2.0 introduce una nueva sintaxis para declarar variables de instancia como propiedades, con atributos opcionales para configurar la generación de métodos de acceso. Las propiedades son, en cierto sentido, variables de instancia públicas; esto es, declarar una variable de instancia como una propiedad provee a clases externas de acceso (posiblemente limitado, como por ejemplo solo lectura) a esa propiedad. Una propiedad puede ser declarada como "readonly" (solo lectura) y puede ser provista de semántica de almacenamiento como "assign" (asignar), "copy" (copiar) o "retain" (retener). Por defecto, las propiedades son consideradas atómicas, que resulta en un seguro para prevenir a múltiples hilos que accedan a ella al mismo tiempo. Una propiedad puede ser declarada como "nonatomic" (no atómica), que elimina este seguro.

@interface Persona : NSObject {  @public  NSString *nombre;  @private  int edad; } @property(copy) NSString *nombre; @property(readonly) int edad; -(id)iniciarConEdad:(int)edad; @end 

Las propiedades son implementadas mediante la palabra clave @synthesize, que genera los métodos getter (y setter, si no son de solo lectura) de acuerdo a la declaración de la propiedad. Alternativamente, los métodos getter y setter deben ser implementados explícitamente, o la palabra clave @dynamic puede ser usada para indicar que los métodos de acceso deben ser provistos por otros medios. Cuando se compila usando Clang 3.1 o superior, todas las propiedades que no estén explícitamente declaradas con @dynamic, no estén marcadas readonly o no tengan los métodos completos implementados por el usuario getter y setter, serán automáticamente declaradas @synthesize de manera implícita.

@implementation Persona @synthesize nombre; -(id)iniciarConEdad:(int)edadInicial {  self = [super inicial];  if (self) {  edad = edadInicial; // NOTA: asignación directo de la variable de instancia, no propiedad setter  }  return self; } -(int)edad {  return edad; } @end 

Las propiedades pueden ser accedidas usando la sintaxis tradicional de paso de mensajes, notació por puntos o, en Codificación Key-Value, mediante los métodos valueForKey:/setValue:forKey.

Persona *unaPersona = [[Persona alloc] iniciarConEdad: 53]; unaPersona.nombre = @"Steve"; // NOTA: la notación por puntos, usa el setter sintetizado,  // equivalente a [unaPersona setNombre: @"Steve"]; NSLog(@"Acceso por mensaje (%@), notación por puntos(%@), nombre de propiedad(%@) y acceso directo a la variabled e instancia (%@)",  [unaPersona nombre], unaPersona.nombre, [unaPersona valueForKey:@"nombre"], unaPersona->nombre); 

Para que el uso de notación por puntos invoque a las propiedades de acceso en un método de instancia, la palabra clave "self" debe ser usada:

-(void) presentarmeConPropiedades:(BOOL)useGetter {  NSLog(@"Hola, mi nombre es %@.", (useGetter ? self.nombre : nombre)); // NOTA: getter vs. acceso ivar } 

Una clase o las propiedades de protocolo pueden ser introspeccionadas dinámicamente.

int i; int contadorPropiedades = 0; objc_propiedad_t *listaPropiedades = clase_copiarListaPropiedades([unaPersona class], &contadorPropiedades); for (i = 0; i < contadorPropiedades; i++) {  objc_propiedad_t *estaPropiedad = listaPropiedades + i;  const char* nombrePropiedad = propiedad_getNombre(*estaPropiedad);  NSLog(@"Persona tiene una propiedad: '%s'", nombrePropiedad); } 

Variables de instancia no frágiles

Objective-C 2.0 provee de variables de instancia no frágiles soportadas por el entorno de ejecución (por ejemplo, creando código para un Mac OS X de 64 bits así como código para todos los iOS). Bajo el entorno de ejecución moderno, una capa extra de sesgo es añadida para instanciar variables de acceso, permitiendo al enlazador dinámico ajustar el plano de instanciaciones en tiempo de ejecución. Esta propiedad permite dos grandes mejoras en el código Objective-C:

  • Elimina el problema de la fragilidad de interfaces binarias - las superclases pueden cambiar su tamaño sin afectar a la compatibilidad binaria.
  • Permite que las variables de instancia que proveen retrocompatibilidad para las propiedades puedan ser sintetizadas en el tiempo de ejecución sin que estén declaradas en la interfaz de la clase.

Enumeración rápida

En lugar de usar un objeto NSEnumerator o indicar la iteración a lo largo de una colección, Objective-C 2.0 ofrece la sintaxis de enumeración rápida. En Objective-C 2.0, los siguientes bucles son funcionalmente equivalentes, pero tienen diferentes características de rendimiento.

// Usando NSEnumerator NSEnumerator *enumerador = [laGente objectEnumerator]; Persona *p; while ((p = [enumerador nextObject]) != nil) {  NSLog(@"%@ tiene %i años.", [p nombre], [p edad]); } 
// Usando índices for (int i = 0; i < [laGente count]; i++) {  Persona *p = [laGente objectAtIndex:i];  NSLog(@"%@ tiene %i años.", [p nombre], [p edad]); } 
// Using enumeración rápida for (Persona *p in laGente) {  NSLog(@"%@ tiene %i años.", [p nombre], [p edad]); } 

La enumeración rápida genera código más eficiente que la enumeración estándar porque las llamadas a los métodos para enumerar objetos son reemplazadas por aritmética de punteros usando el protocolo NSFastEnumeration.

Extensión de clases

Una extensión de clase tiene el mismo sintaxis que una declaración de categoría sin nombre de categoría y los métodos y propiedades declarados en ella son añadidos directamente a la clase main. Es sobre todo usado como una alternativa a una categoría el añadir métodos a una clase sin declararlos en las cabeceras públicas, con la ventaja de que para las extensiones de clase el compilador comprueba que todos los métodos declarados privadamente son implementados realmente.[7]

Blocks

Blocks es una extensión no estándar para Objective-C (así como para C y C++) que usa una sintaxis especial para crear clausuras. Blocks solo está soportado en Mac OS X 10.6 "Snow Leopard" o superior y en iOS 4 o superior, así como en GNUstep con libobjc2 1.7 y compilado con Clang 3.1 o superior.[14]

#include <stdio.h> #include <Block.h> typedef int (^IntBlock)(); IntBlock MakeCounter(int start, int increment) {  __block int i = start;    return Block_copy( ^ {  int ret = i;  i += increment;  return ret;  });   } int main(void) {  IntBlock mycounter = MakeCounter(5, 2);  printf("First call: %d\n", mycounter());  printf("Second call: %d\n", mycounter());  printf("Third call: %d\n", mycounter());    /* because it was copied, it must also be released */  Block_release(mycounter);    return 0; } /* Output:  First call: 5  Second call: 7  Third call: 9 */ 

Modern Objective-C

Automatic Reference Counting

Automatic Reference Counting (Conteo Automático de Referencias, ARC) es una característica del tiempo de compilación que elimina la necesidad de que los programadores tengan que guardar manualmente cuentas usando retain y release.[11]​ Al contrario que el recolector de basura, que funciona en tiempo de ejecución, el ARC elimina la sobrecarga de un proceso separado al gestionar la retención de las cuentas. El ARC y el manejo manual de memoria no son mutualmente excluyentes; los programadores pueden continuar usando código no ARC en proyectos que tienen el ARC activado mediante la desactivación del ARC para códigos fuente individuales. Xcode también puede tratar de actualizar automáticamente un proyecto a ARC.

Literales

Los entornos de ejecución NeXT y Apple Obj-C incluyeron hace tiempo un atajo para crear nuevas cadenas, usando la sintaxis literal @"una nueva cadena" y también desecharon las constantes de CoreFoundation kCFBooleanTrue y kCFBooleanFalse por la variable NSNUmber con valores booleanos. Al usar este formato se libera al programador de usar el más largo initWithString o métodos similares al hacer ciertas operaciones.

Cuando se usa el compilador de Apple LLVM 4.0 o superior, vectores, diccionarios y números (las clases NSAray, NSDictionary y NSNumber) pueden ser también creados usando sintaxis literal en lugar de métodos.[15]​ La sintaxis literal usa el símbolo @ combinado con [], {} o () para crear las clases mencionadas anteriormente, respectivamente.[16]

Ejemplo sin literales:

NSArray *miVector = [NSArray arrayConObjectos:objeto1,objeto2,objeto3,nil]; NSDictionary *miDiccionario1 = [NSDictionary diccionarioConObjeto:unObjeto forKey:@"llave"]; NSDictionary *miDiccionario2 = [NSDictionary diccionarioConObjetosYLlaves:objeto1, llave1, objeto2, llave2, nil]; NSNumber *miNumero = [NSNumber numeroConInt:miInt]; NSNumber *miNumeroSuma = [NSNumber numeroConInt:(2 + 3)]; NSNumber *miNumeroBooleano = [NSNumber numeroConBooleano:YES]; 

Ejemplo con literales:

NSArray *myVector = @[ objeto1, objeto2, objeto3 ]; NSDictionary *miDiccionario1 = { @"llave" : unObjeto }; NSDictionary *miDiccionario2 = { llave1: objeto1, llave2: objeto2 }; NSNumber *miNumero = @{miInt}; NSNumber *miNumeroSuma = @{2+3}; NSNumber *miNumeroBooleano = @YES; 

Sin embargo, al contrario que las cadenas literales que se compilan como constantes en el ejecutable, estos literales se compilan como código equivalente a las llamadas a métodos mencionadas arriba. En particular, bajo manejo manual del conteo de referencia de memoria, estos objetos son autoliberados, lo que requiere especial cuidado cuando por ejemplo son usados con variables de funciones estáticas o otros tipos de variables globales.

Subíndices

Cuando se usa el compilador de Apple LLVM 4.0 o superior, vectores y diccionarios (las clases NSArray y NSDictionary) pueden ser manipuladas usando subíndices.[15]​ Los subíndices se pueden usar para recuperar valores de índices (vectores) o llaves (diccionarios) y con objetos mutables también puede user para fijar objetos a índices o llaves. En el código, los subíndices son representados usando corchetes [ ].[16]

Ejemplos sin subíndices:

id objeto1 = [unVector objectAtIndex:0]; id objeto2 = [unDiccionario objectForKey:@"llave"]; [unVectorMutable replaceObjectAtIndex:0 withObject:objeto3]; [unDiccionarioMutable setObject:objeto4 forKey:@"llave"]; 

Ejemplos con subíndices:

id objeto1 = unVector[0]; id objeto2 = unDiccionario[@"llave"]; unVectorMutable[0] = objeto3; unDiccionarioMutable[@"llave"] = objeto4; 

Sintaxis de Objective-C "Moderna" (1997)

Tras la compra de NeXT por parte de Apple, se hicieron varios intentos para asemejar más el lenguaje con respecto a otros lenguajes existentes. Uno de estos intentos fue la introducción de lo que se denominó en su momento "Sintaxis moderna" para Objective-C (en oposición a la existente, sintaxis "clásica"). No había cambios en el comportamiento real, simplemente era una sintaxis alternativa. La invocación a un método se hacía de este modo:

objeto = (MiClase.alloc).init; objeto.primeraEtiq ( param1, param2 ); 

Y pasó a escribirse de este otro modo:

objeto = [[MiClase alloc] init]; [objeto primeraEtiq: param1 segundaEtiq: param2]; 

Similarmente, las declaraciones pasaron de ser así:

-(void) primeraEtiq ( int param1, int param2 ); 

a ser así:

-(void) primeraEtiq: (int)param1 segundaEtiq: (int)param2; 

Esta sintaxis "moderna" no está soportada en dialectos actuales de Objective-C.

Portable Object Compiler

Además de las implementaciones de GCC/NeXT/Apple, que añadieron varias extensiones a la implementación original de Stepstone, también existe otra implementación libre y abierta de Objective-C llamada Protable Object Compiler.[17]​ El conjunto de extensiones implementadas por el Portable Object Compiler difiere de las implementaciones GCC/NeXT/Apple; en particular, incluye blocks similares a los de Smalltalk para Objective-C, mientras que carece de protocolos y categorías, dos características usadas ampliamente en OpenStep y sus derivados. En conjunto, POC representa una etapa vieja, pre-NeXT, de la evolución del lenguaje, simplemente conforme al libro de 1991 de Brad Cox.

También incluye una librería de tiempo de ejecución llamada ObjectPak, que está basada en la librería original ICPak101 de Cox (que a su vez deriva de la librería de clases Smalltalk-80) y es radicalmente diferente a la de OneStep FoundationKit.

GEOS Objective-C

El sistema PC GEOS usaba un lenguaje de programación conocido como GEOS Objective-C o goc;[18]​ a pesar de su similar nombre, los dos lenguajes son similares en un concepto global y por el uso de palabras clave precedidas por el signo @.

Clang

La suite de compiladores Clang, parte del proyecto LLVM, implementa Objective-C así como otros lenguajes.

Véase también

Referencias

  1. «Introducción a GNUstep» (en inglés). Consultado el 10 de julio de 2014. 
  2. . Archivado desde el original el 1 de julio de 2009. Consultado el 19 de junio de 2019. 
  3. (en inglés). 19 de noviembre de 2008. Archivado desde el original el 31 de diciembre de 2008. Consultado el 10 de julio de 2014. 
  4. «Documentación de Clang 3.5 - Interoperabilidad con las lambdas de C++11» (en inglés). Consultado el 10 de julio de 2014. 
  5. Dave Vasilevsky (10 de agosto de 2006). (en inglés). Archivado desde el original el 18 de junio de 2009. Consultado el 10 de julio de 2014. 
  6. Dietmar Planitzer (9 de agosto de 2006). (en inglés). Archivado desde el original el 24 de noviembre de 2010. Consultado el 10 de julio de 2014. 
  7. «Lanzamiento de la serie GCC 4.6: Cambios, nuevas características y arreglos» (en inglés). Consultado el 10 de julio de 2014. 
  8. Apple. «API del recolector de basura» (en inglés). Consultado el 10 de julio de 2014. 
  9. Apple. «Introducción al recolector de basura» (en inglés). Consultado el 10 de julio de 2014. 
  10. Apple (6 de noviembre de 2007). (en inglés). Archivado desde el original el 24 de julio de 2010. Consultado el 10 de julio de 2014. 
  11. Apple (17 de julio de 2012). «Notas de la transición a ARC» (en inglés). Consultado el 10 de julio de 2014. 
  12. Mike Ash (27 de septiembre de 2013). «ARM64 y tú» (en inglés). Consultado el 10 de julio de 2014. 
  13. SealieSoftware.com (24 de septiembre de 2013). «Objective-C explicado: ISA no es un puntero» (en inglés). Consultado el 10 de julio de 2014. 
  14. Apple (8 de marzo de 2011). «Programación en Blocks» (en inglés). Consultado el 10 de julio de 2014. 
  15. Apple. «Programando con Objective-C: Valores y colecciones» (en inglés). Consultado el 10 de julio de 2014. 
  16. Clang. «Literales de Objective-C» (en inglés). Consultado el 10 de julio de 2014. 
  17. «Portable Object Compiler» (en inglés). Consultado el 10 de julio de 2014. 
  18. «GEOS SDK» (en inglés). Consultado el 10 de julio de 2014. 

Enlaces externos

  • .
  • .
  • .
  • .
  •   Datos: Q188531
  •   Multimedia: Objective-C

objective, lenguaje, programación, orientado, objetos, creado, como, superconjunto, para, implementase, modelo, objetos, parecido, smalltalk, originalmente, creado, brad, corporación, stepstone, 1980, 1988, adoptado, como, lenguaje, programación, nextstep, 199. Objective C es un lenguaje de programacion orientado a objetos creado como un superconjunto de C para que implementase un modelo de objetos parecido al de Smalltalk Originalmente fue creado por Brad Cox y la corporacion StepStone en 1980 En 1988 fue adoptado como lenguaje de programacion de NEXTSTEP y en 1992 fue liberado bajo licencia GPL para el compilador GCC Actualmente se usa como un lenguaje principal de programacion para Mac OS X iOS y GNUstep ademas de Swift Objective C Informacion generalExtensiones comunesh m mm y CParadigmaorientado a objetosAparecio en1980Disenado porBrad CoxSistema de tiposfuerte estaticoImplementacionesnumerosasInfluido porC SmalltalkHa influido aObjective C Java editar datos en Wikidata Indice 1 Historia 1 1 Popularizacion mediante NeXT 1 2 Desarrollo de Apple y Swift 2 Sintaxis 2 1 Mensajes 2 2 Interfaces e implementaciones 2 2 1 Interfaz 2 2 2 Implementacion 2 2 3 Instanciacion 2 3 Protocolos 2 4 Tipado dinamico 2 5 Reenvio 2 5 1 Ejemplo 2 5 2 Notas 3 Variantes del lenguaje 3 1 Objective C 3 2 Objective C 2 0 3 2 1 Recoleccion de basura 3 2 2 Propiedades 3 2 3 Variables de instancia no fragiles 3 2 4 Enumeracion rapida 3 2 5 Extension de clases 3 3 Blocks 3 4 Modern Objective C 3 4 1 Automatic Reference Counting 3 4 2 Literales 3 4 3 Subindices 3 5 Sintaxis de Objective C Moderna 1997 3 6 Portable Object Compiler 3 7 GEOS Objective C 3 8 Clang 4 Vease tambien 5 Referencias 6 Enlaces externosHistoria EditarA principios de los 80 el software se desarrollaba usando programacion estructurada La programacion estructurada se establecio para ayudar a dividir los programas en pequenas partes haciendo mas facil el desarrollo cuando la aplicacion se volvia muy grande Sin embargo como los problemas seguian creciendo al pasar el tiempo la programacion estructurada se volvio compleja dado el desorden de algunos programadores para invocar instrucciones repetitivamente llevando a codigo spaghetti y dificultando la reutilizacion de codigo Muchos vieron que la programacion orientada a objetos seria la solucion al problema De hecho Smalltalk ya tenia solucionados muchos de estos problemas algunos de los sistemas mas complejos en el mundo funcionaban gracias a Smalltalk Pero Smalltalk usaba una maquina virtual lo cual requeria mucha memoria para esa epoca y era demasiado lento Objective C fue creado principalmente por Brad Cox y Tom Love a inicios de los 80 en su compania Stepstone Ambos fueron iniciados en Smalltalk mientras estaban en el Programming Technology Center de ITT en 1981 Cox se vio interesado en los problemas de reutilizacion en el desarrollo de software Se dio cuenta de que un lenguaje como Smalltalk seria imprescindible en la construccion de entornos de desarrollo potentes para los desarrolladores en ITI Corporation Cox empezo a modificar el compilador de C para agregar algunas de las capacidades de Smalltalk Pronto tuvo una extension para anadir la programacion orientada a objetos a C la cual llamo OOPC Object Oriented Programming in C Love mientras tanto fue contratado por Shlumberger Research en 1982 y tuvo la oportunidad de adquirir la primera copia de Smalltalk 80 lo que influyo en su estilo como programador Para demostrar que se hizo un progreso real Cox mostro que para hacer componentes de software verdaderamente intercambiables solo se necesitaban unos pequenos cambios en las herramientas existentes Especificamente estas necesitaban soportar objetos de manera flexible venir con un conjunto de bibliotecas que fueran utilizables y permitir que el codigo y cualquier recurso necesitado por el codigo pudiera ser empaquetado en un formato multiplataforma Cox y Love luego fundaron una nueva empresa Productivity Products International PPI para comercializar su producto el cual era un compilador de Objective C con un conjunto de bibliotecas potentes En 1986 Cox publico la principal descripcion de Objective C en su forma original en el libro Object Oriented Programming An Evolutionary Approach Aunque el fue cuidadoso en resaltar que hay muchos problemas de reutilizacion que no dependen del lenguaje Objective C frecuentemente fue comparado detalladamente con otros lenguajes Popularizacion mediante NeXT Editar En 1988 NeXT licencio el Objective C de StepStone el nuevo nombre de PPI el dueno de la marca Objective C y extendio el compilador GCC para dar soporte a Objective C al mismo tiempo que desarrollo las librerias AppKit y Foundation Kit sobre las que se basaron la interfaz de usuario y la interfaz de creacion de NeXTstep Mientras que las estaciones de trabajo de NeXT no consiguieron hacer un gran impacto en el mercado las herramientas fueron ampliamente alabadas en la industria Esto llevo a NeXT a abandonar la produccion de hardware y enfocarse en las herramientas de software vendiendo NeXTstep y OpenStep como una plataforma para la programacion a medida El trabajo para extender GCC fue liderado por Steve Naroff que se unio a NeXT proveniente de StepStone Los cambios del compilador fueron puestos a disposicion bajo terminos de licencia GPL pero no las librerias de tiempo de ejecucion dejando la contribucion de codigo abierto inutilizable para el publico general Esto llevo a que otras companias desarrollaran esas librerias bajo licencias de codigo abierto Mas tarde Steve Naroff fue tambien un colaborador principal al trabajo de Apple de construir la interfaz de Objective C Clang El proyecto GNU comenzo a trabajar en su implementacion de Cocoa como software libre llamado GNUstep y basado en el estandar de OpenStep 1 Dennis Glatting escribio el primer sistema en tiempo de ejecucion de GNU Objective C en 1992 El sistema GNU Objective C que ha sido usado desde 1993 es uno de los desarrollados por Kresten Krab Thorup cuando era un estudiante universitario en Dinamarca Thorup tambien trabajo en NeXT desde 1993 hasta 1997 Desarrollo de Apple y Swift Editar Tras adquirir NeXT en 1996 Apple empleo OpenStep en su nuevo sistema operativo Mac OS X Este incluia Objective C y la herramienta de desarrollo basada en Objective C de NeXT Project Builder que luego se ha expandido y ahora se conoce por Xcode asi como la herramienta de diseno de interfaz Interface Builder La mayoria de la actual Cocoa API de Apple esta basada en objetos de interfaz de OneStep y es el entorno de desarrollo de Objective C mas usado para desarrollo activo En la WWDC de 2014 Apple anuncio planes para reemplazar a Objective C en el desarrollo de Cocoa por el nuevo lenguaje Swift que es llamado Objective C sin la C Sintaxis EditarObjective C consiste en una capa muy fina situada por encima de C y ademas es un estricto superconjunto de C Esto es es posible compilar cualquier programa escrito en C con un compilador de Objective C y tambien puede incluir libremente codigo en C dentro de una clase de Objective C Esto es para escribir el programa clasico Hola Mundo para correr en consola se puede utilizar el siguiente codigo import lt stdio h gt int main int argc const char argv printf Hola Mundo n return 0 El codigo anterior se diferencia de un codigo en C comun por la primera instruccion import que difiere del include del C clasico pero la funcion printf es puramente C La funcion propia de Objective C para imprimir una cadena de caracteres en consola es NSLog utilizandola el codigo anterior quedaria de la siguiente manera int main int argc const char argv NSLog Hola Mundo n return 0 La sintaxis de objetos de Objective C deriva de Smalltalk Toda la sintaxis para las operaciones no orientadas a objetos incluyendo variables primitivas pre procesamiento expresiones declaracion de funciones y llamadas a funciones son identicas a las de C mientras que la sintaxis para las caracteristicas orientadas a objetos es una implementacion similar a la mensajeria de Smalltalk Mensajes Editar El modelo de programacion orientada a objetos de Objective C se basa en enviar mensajes a instancias de objetos Esto es diferente al modelo de programacion al estilo de Simula utilizado por C y esta distincion es semanticamente importante En Objective C uno no llama a un metodo uno envia un mensaje y la diferencia entre ambos conceptos radica en como el codigo referido por el nombre del mensaje o metodo es ejecutado En un lenguaje al estilo Simula el nombre del metodo es en la mayoria de los casos atado a una seccion de codigo en la clase objetivo por el compilador pero en Smalltalk y Objective C el mensaje sigue siendo simplemente un nombre y es resuelto en tiempo de ejecucion el objeto receptor tiene la tarea de interpretar por si mismo el mensaje Una consecuencia de esto es que el mensaje del sistema que pasa no tiene chequeo de tipo el objeto al cual es dirigido el mensaje conocido como receptor no esta inherentemente garantizado a responder a un mensaje y si no lo hace simplemente lo ignora y retorna un puntero nulo Enviar el mensaje method al objeto apuntado por el puntero obj requeriria el siguiente codigo en C obj gt method parameter mientras que en Objective C se escribiria como sigue obj method parameter Ambos estilos de programacion poseen sus fortalezas y debilidades La POO al estilo Simula permite herencia multiple y rapida ejecucion utilizando vinculacion en tiempo de compilacion siempre que sea posible pero no soporta vinculacion dinamica por defecto Esto fuerza a que todos los metodos posean su correspondiente implementacion al menos que sean virtuales aun asi se requiere una implementacion del metodo para efectuar la llamada La POO al estilo Smalltalk permite que los mensajes no posean implementacion por ejemplo toda una coleccion de objetos pueden enviar un mensaje sin temor a producir errores en tiempo de ejecucion El envio de mensajes tampoco requiere que un objeto sea definido en tiempo de compilacion Ver mas abajo la seccion tipado dinamico para mas ventajas de la ligadura dinamica Sin embargo se debe notar que debido a la sobrecarga de la interpretacion de los mensajes un mensaje en Objective C toma en el mejor de los casos tres veces mas tiempo que una llamada a un metodo virtual en C 2 Interfaces e implementaciones Editar Objective C requiere que la interfaz e implementacion de una clase esten en bloques de codigo separados Por convencion la interfaz es puesta en un archivo cabecera y la implementacion en un archivo de codigo los archivos cabecera que normalmente poseen el sufijo h son similares a los archivos cabeceras de C los archivos de implementacion metodo que normalmente poseen el sufijo m pueden ser muy similares a los archivos de codigo de C Interfaz Editar La interfaz de la clase es usualmente definida en el archivo cabecera Una convencion comun consiste en nombrar al archivo cabecera con el mismo nombre de la clase La interfaz para la clase Clase deberia asi ser encontrada en el archivo Clase h La declaracion de la interfaz de la forma interface classname superclassname instance variables classMethod1 return type classMethod2 return type classMethod3 param1 type parameter varName return type instanceMethod1 param1 type param1 varName param2 type param2 varName return type instanceMethod2WithParameter param1 type param1 varName andOtherParameter param2 type param2 varName end Los signos mas denotan metodos de clase los signos menos denotan metodos de instancia Los metodos de clase no tienen acceso a las variables de la instancia Si usted viene de C el codigo anterior es equivalente a algo como esto class classname superclassname public instance variables Class static functions static void classMethod1 static return type classMethod2 static return type classMethod3 param1 type parameter varName Instance member functions return type instanceMethod1 param1 type param1 varName param2 type param2 varName return type instanceMethod2WithParameter param1 type param1 varName param2 type param2 varName default Note que instanceMethod2WithParameter demuestra la capacidad de nombrado de parametro de Objective C para la cual no existe equivalente directo en C C Los tipos de retorno pueden ser cualquier tipo estandar de C un puntero a un objeto generico de Objective C o un puntero a un tipo especifico asi como NSArray NSImage o NSString El tipo de retorno por defecto es el tipo generico id de Objective C Los argumentos de los metodos comienzan con dos puntos seguidos por el tipo de argumento esperado en los parentesis seguido por el nombre del argumento En algunos casos por ej cuando se escriben APIs de sistema es util agregar un texto descriptivo antes de cada parametro void setRangeStart int start End int end void importDocumentWithName NSString name withSpecifiedPreferences Preferences prefs beforePage int insertPage Implementacion Editar La interfaz unicamente declara la interfaz de la clase y no los metodos en si el codigo real es escrito en la implementacion Los archivos de implementacion metodos normalmente poseen la extension m implementation classname classMethod implementation instanceMethod implementation end Los metodos son escritos con sus declaraciones de interfaz Comparando Objective C y C int method int i return self square root i int function int i return square root i La sintaxis admite pseudo nombrado de argumentos int changeColorToRed float red green float green blue float blue myColor changeColorToRed 5 0 green 2 0 blue 6 0 La representacion interna de este metodo varia entre diferentes implementaciones de Objective C Si myColor es de la clase Color internamente la instancia del metodo changeColorToRed green blue podria ser etiquetada como i Color changeColorToRed green blue La i hace referencia a una instancia de metodo acompanado por los nombres de la clase y el metodo y los dos puntos son reemplazados por guiones bajos Como el orden de los parametros es parte del nombre del metodo este no puede ser cambiado para adaptarse al estilo de codificacion De todos modos los nombres internos de las funciones son raramente utilizadas de manera directa y generalmente los mensajes son convertidos a llamadas de funciones definidas en la libreria en tiempo de ejecucion de Objective C el metodo que sera llamado no es necesariamente conocido en tiempo de vinculacion la clase del receptor el objeto que envio el mensaje no necesita conocerlo hasta el tiempo de ejecucion Instanciacion Editar Una vez que una clase es escrita en Objective C puede ser instanciada Esto se lleva a cabo primeramente alojando la memoria para el nuevo objeto y luego inicializandolo Un objeto no es completamente funcional hasta que ambos pasos sean completados Esos pasos tipicamente se logran con una simple linea de codigo MyObject o MyObject alloc init La llamada a alloc aloja la memoria suficiente para mantener todas las variables de instancia para un objeto y la llamada a init puede ser anulada para establecer las variables de instancia con valores especificos al momento de su creacion El metodo init es escrito a menudo de la siguiente manera id init self super init if self ivar1 value1 ivar2 value2 return self Protocolos Editar Objective C fue extendido en NeXT para introducir el concepto de herencia multiple de la especificacion pero no la implementacion a traves de la introduccion de protocolos Este es un modelo viable ya sea como una clase base abstracta multi heredada en C o como una interfaz como en Java o C Objective C hace uso de protocolos ad hoc llamados protocolos informales y el compilador debe cumplir los llamados protocolos formales Tipado dinamico Editar Objective C al igual que Smalltalk puede usar tipado dinamico un objeto puede recibir un mensaje que no esta especificado en su interfaz Esto se permite para incrementar la flexibilidad ya que permite a un objeto capturar un mensaje y enviarlo a otro objeto diferente que pueda responder a ese mensaje apropiadamente o del mismo modo reenviar el mensaje a otro objeto Este comportamiento es conocido como reenvio de mensajes o delegacion ver mas abajo Alternativamente un manejo de error puede ser usado en caso de que el mensaje no pueda ser reenviado Si un objeto no reenvia un mensaje lo responde o maneja un error entonces el sistema generara una excepcion en tiempo de ejecucion Si los mensajes son enviados a nil el puntero de objetos nulo seran ignorados silenciosamente o elevaran una excepcion generica dependiendo de las opciones del compilador La informacion tipada estaticamente puede ser anadida opcionalmente a variables Esta informacion es luego comprobada a la hora de compilar En las siguientes cuatro declaraciones se proveen tipos de informacion crecientemente especificos Estas declaraciones son equivalentes en el tiempo de ejecucion pero la informacion adicional permite al compilador el avisar al programador si el argumento pasado no encaja con el tipo especificado void setMyValue id foo En la declaracion anterior foo puede ser de cualquier clase void setMyValue id lt NSCopying gt foo En la declaracion anterior foo puede ser una instancia de cualquier clase que satisfaga al protocolo NSCopying void setMyValue NSNumber foo En la declaracion anterior foo debe ser una instancia de la clase NSNumber void setMyValue NSNumber lt NSCopying gt foo En la declaracion anterior foo debe ser una instancia de la clase NSNumber y debe satisfacer al protocolo NSCopying Reenvio Editar Objective C permite el envio de un mensaje a un objeto que puede no responder En lugar de responder o simplemente ignorar el mensaje un objeto puede reenviar el mensaje a otro objeto que pueda responderlo El reenvio puede ser usado para simplificar la implementacion de ciertos patrones de diseno como el observer o el proxy El tiempo de ejecucion de Objective C especifica un par de metodos en Object metodos de reenvio retval t forward SEL sel args arglist t args con GCC id forward SEL sel args marg list args con sistemas NeXT Apple metodos de accion retval t performv SEL sel args arglist t args con GCC id performV SEL sel args marg list args con sistemas NeXT Apple Un objeto que desee implementar el reenvio solamente necesita sobreescribir el metodo de reenvio con un nuevo metodo que defina el comportamiento de reenvio El metodo de accion performv no necesita ser sobreescrito ya que este metodo meramente realiza una accion basada en el selector y los argumentos El tipo SEL es el tipo de mensajes en Objective C Nota en openStep Cocoa y GNUstep los espacios de trabajo de Objective C comunmente usados no hay que usar la clase Object el metodo void forwardInvocation NSInvocation anInvocation de la clase NSObject es usado para realizar el reenvio Ejemplo Editar Aqui hay un ejemplo de un programa que demuestra las bases del reenvio Forwarder h import lt objc Object h gt interface Forwarder Object id recipient El objeto al que queremos reenviar el mensaje Metodos de acceso id recipient id setRecipient id recipient end Forwarder m import Forwarder h implementation Forwarder retval t forward SEL sel args arglist t args Comprueba si el receptor responde al mensaje Esto puede ser o no deseable por ejemplo si un receptor a su vez no responde el mensaje podria reenviarlo el mismo if recipient respondsToSelector sel return recipient performv sel args args else return self error El receptor no responde id setRecipient id recipient recipient autorelease recipient recipient retain return self id recipient return recipient end Recipient h import lt objc Object h gt Un simlpe objeto receptor interface Recipient Object id hola end Recipient m import Recipient h implementation Recipient id hola printf El receptor dice hola n return self end main m import Forwarder h import Recipient h int main void Forwarder forwarder Forwarder new Recipient recipient Recipient new forwarder setRecipient recipient Elige el receptor Vease que el reenviante no ersponda al saludo Sera reenviado Todos los metodos no reconocidos seran reenviados al receptor si el receptor los responde como se dice en el Forwarder forwarder hello recipient release forwarder release return 0 Notas Editar Cuando se compila con gcc el compilador reporta gcc x objective c Wno import Forwarder m Recipient m main m lobjcmain m In function main main m 12 warning Forwarder no responde a hola El compilador reporta lo comentando antes que Forwarder no responde a mensajes hola En esta circunstancia es seguro ignorar el aviso ya que el reenvio fue implementando La ejecucion del programa produce esta salida amp a outEl receptor dice hola Variantes del lenguaje EditarObjective C Editar Objective C es una variante del lenguaje aceptada por la interfaz del GNU Compiler Collection y Clang que puede compilar archivos de codigo fuente que usen una combinacion de sintaxis de C y Objective C Objective C anade a C las extensiones que Objective C anade a C Como no se hace nada para unificar la semantica detras de las caracteristicas de varios lenguajes existen ciertas restricciones Una clase de C no puede derivar de una clase de Objective C y viceversa Espacios de nombres de C no pueden ser declarados dentro de una declaracion de Objective C Las declaraciones de Objective C deben aparecer de manera global no dentro de una declaracion de C Las clases de Objective C no pueden tener instancias variables de clases de C que no tengan un constructor por defecto o que tengan uno o mas metodos virtuales pero los punteros a objetos de C pueden ser usados como instancias variables sin restriccion se asignan en el metodo init Las semanticas por valor de C no pueden ser aplicadas a objetos de Objective C que solamente son accesibles mediante punteros Una declaracion de Objective C no puede estar dentro de una plantilla de declaracion de C y viceversa Sin embargo los tipos de Objective C como Classname pueden ser usados como parametros de plantillas de C El manejo de excepciones de Objective C y C es distinto cada lenguaje solamente puede manejar excepciones propias Esto es mitigado en recientes versiones o bien reemplazando completamente las exceptiones de Objective C por excepciones de C como hace Apple o parcialmente cuando esta enlacada la libreria de Objective C GNUstep libobjc2 Hay que tener cuidado ya que las llamadas al destructor de las excepciones en tiempo de ejecucion de Objective C y C no coinciden por ejemplo un destructor de C no sera llamado cuando una excepcion de Objective C sale del alcance de un objeto de C Las nuevas versiones de 64 bits solucionan esto mediante la introduccion de interoperabilidad con las excepciones de C en este sentido 3 Los blocks de Objective C y las lambdas de C 11 son entidades distintas sin embargo un block es generado transparentemente en Mac OS X cuando se pasa una lambda donde se espera un block 4 Objective C 2 0 Editar En la Worldwide Developers Conference de 2006 Apple anuncio el lanzamiento de Objective C 2 0 una revision del lenguaje Objective C para incluir una recoleccion de basura moderna mejoras de sintaxis 5 perfeccionamiento de la ejecucion 6 y soporte para 64 bits Mac OS X v10 5 lanzado en octubre de 2007 incluia un compilador de Objective C 2 0 GCC 4 6 soporta muchas aplicaciones nuevas de Objective C como las propiedades declaradas y sintetizadas sintaxis de puntos enumeracion rapida metodos de protocolo opcionales atributos de metodo protocolo clase extensiones de clase y una nueva API de GNUnn Objective C 7 Recoleccion de basura Editar Objective 2 0 contaba con un recolector de basura conservativo opcional Cuando se ejecutaba en modo de retrocompatibilidad cambiaba las operaciones de conteo de referencias como retener y liberar en NOPs No operaciones instruccion de ensamblador que indica que el procesador no tiene que hacer nada Todos los objetos eran sometidos al recolector de basura cuando la recoleccion de basura estaba habilitada Los punteros de C podian ser cualificados con strong para provocar la intercepcion de escritura del compilador y asi participar en la recoleccion de basura 8 Un subsistema debil de puesta a cero tambien era provisto de tal manera que los punteros marcados con weak eran puestos a cero cuando el objeto o mas facilmente la memoria del recolector de basura es recolectado El recolector de basura no existia en la implementacion de Objective C 2 0 de iOS 9 La recoleccion de basura en Objective C se ejecuta en un hilo de baja prioridad y puede detener eventos del usuario con la intencion de mantener la experiencia del usuario receptiva 10 La recoleccion de basura nunca estuvo disponible en iOS debido a problemas de rendimiento Fue despreciado en la version 10 8 de OS X en favor del Conteo de Referencias Automatico en ingles Automatic Reference Counting ARC y esta programado que se elimine en una futura version de OS X 11 Objective C en iOS 7 ejecutado en ARM64 usa 19 bits de una palabra de 64 bits para almacenar el conteo de referencias como una forma de puntero etiquetado 12 13 Propiedades Editar Objective 2 0 introduce una nueva sintaxis para declarar variables de instancia como propiedades con atributos opcionales para configurar la generacion de metodos de acceso Las propiedades son en cierto sentido variables de instancia publicas esto es declarar una variable de instancia como una propiedad provee a clases externas de acceso posiblemente limitado como por ejemplo solo lectura a esa propiedad Una propiedad puede ser declarada como readonly solo lectura y puede ser provista de semantica de almacenamiento como assign asignar copy copiar o retain retener Por defecto las propiedades son consideradas atomicas que resulta en un seguro para prevenir a multiples hilos que accedan a ella al mismo tiempo Una propiedad puede ser declarada como nonatomic no atomica que elimina este seguro interface Persona NSObject public NSString nombre private int edad property copy NSString nombre property readonly int edad id iniciarConEdad int edad end Las propiedades son implementadas mediante la palabra clave synthesize que genera los metodos getter y setter si no son de solo lectura de acuerdo a la declaracion de la propiedad Alternativamente los metodos getter y setter deben ser implementados explicitamente o la palabra clave dynamic puede ser usada para indicar que los metodos de acceso deben ser provistos por otros medios Cuando se compila usando Clang 3 1 o superior todas las propiedades que no esten explicitamente declaradas con dynamic no esten marcadas readonly o no tengan los metodos completos implementados por el usuario getter y setter seran automaticamente declaradas synthesize de manera implicita implementation Persona synthesize nombre id iniciarConEdad int edadInicial self super inicial if self edad edadInicial NOTA asignacion directo de la variable de instancia no propiedad setter return self int edad return edad end Las propiedades pueden ser accedidas usando la sintaxis tradicional de paso de mensajes notacio por puntos o en Codificacion Key Value mediante los metodos valueForKey setValue forKey Persona unaPersona Persona alloc iniciarConEdad 53 unaPersona nombre Steve NOTA la notacion por puntos usa el setter sintetizado equivalente a unaPersona setNombre Steve NSLog Acceso por mensaje notacion por puntos nombre de propiedad y acceso directo a la variabled e instancia unaPersona nombre unaPersona nombre unaPersona valueForKey nombre unaPersona gt nombre Para que el uso de notacion por puntos invoque a las propiedades de acceso en un metodo de instancia la palabra clave self debe ser usada void presentarmeConPropiedades BOOL useGetter NSLog Hola mi nombre es useGetter self nombre nombre NOTA getter vs acceso ivar Una clase o las propiedades de protocolo pueden ser introspeccionadas dinamicamente int i int contadorPropiedades 0 objc propiedad t listaPropiedades clase copiarListaPropiedades unaPersona class amp contadorPropiedades for i 0 i lt contadorPropiedades i objc propiedad t estaPropiedad listaPropiedades i const char nombrePropiedad propiedad getNombre estaPropiedad NSLog Persona tiene una propiedad s nombrePropiedad Variables de instancia no fragiles Editar Objective C 2 0 provee de variables de instancia no fragiles soportadas por el entorno de ejecucion por ejemplo creando codigo para un Mac OS X de 64 bits asi como codigo para todos los iOS Bajo el entorno de ejecucion moderno una capa extra de sesgo es anadida para instanciar variables de acceso permitiendo al enlazador dinamico ajustar el plano de instanciaciones en tiempo de ejecucion Esta propiedad permite dos grandes mejoras en el codigo Objective C Elimina el problema de la fragilidad de interfaces binarias las superclases pueden cambiar su tamano sin afectar a la compatibilidad binaria Permite que las variables de instancia que proveen retrocompatibilidad para las propiedades puedan ser sintetizadas en el tiempo de ejecucion sin que esten declaradas en la interfaz de la clase Enumeracion rapida Editar En lugar de usar un objeto NSEnumerator o indicar la iteracion a lo largo de una coleccion Objective C 2 0 ofrece la sintaxis de enumeracion rapida En Objective C 2 0 los siguientes bucles son funcionalmente equivalentes pero tienen diferentes caracteristicas de rendimiento Usando NSEnumerator NSEnumerator enumerador laGente objectEnumerator Persona p while p enumerador nextObject nil NSLog tiene i anos p nombre p edad Usando indices for int i 0 i lt laGente count i Persona p laGente objectAtIndex i NSLog tiene i anos p nombre p edad Using enumeracion rapida for Persona p in laGente NSLog tiene i anos p nombre p edad La enumeracion rapida genera codigo mas eficiente que la enumeracion estandar porque las llamadas a los metodos para enumerar objetos son reemplazadas por aritmetica de punteros usando el protocolo NSFastEnumeration Extension de clases Editar Una extension de clase tiene el mismo sintaxis que una declaracion de categoria sin nombre de categoria y los metodos y propiedades declarados en ella son anadidos directamente a la clase main Es sobre todo usado como una alternativa a una categoria el anadir metodos a una clase sin declararlos en las cabeceras publicas con la ventaja de que para las extensiones de clase el compilador comprueba que todos los metodos declarados privadamente son implementados realmente 7 Blocks Editar Articulo principal Blocks extension del lenguaje C Blocks es una extension no estandar para Objective C asi como para C y C que usa una sintaxis especial para crear clausuras Blocks solo esta soportado en Mac OS X 10 6 Snow Leopard o superior y en iOS 4 o superior asi como en GNUstep con libobjc2 1 7 y compilado con Clang 3 1 o superior 14 include lt stdio h gt include lt Block h gt typedef int IntBlock IntBlock MakeCounter int start int increment block int i start return Block copy int ret i i increment return ret int main void IntBlock mycounter MakeCounter 5 2 printf First call d n mycounter printf Second call d n mycounter printf Third call d n mycounter because it was copied it must also be released Block release mycounter return 0 Output First call 5 Second call 7 Third call 9 Modern Objective C Editar Automatic Reference Counting Editar Automatic Reference Counting Conteo Automatico de Referencias ARC es una caracteristica del tiempo de compilacion que elimina la necesidad de que los programadores tengan que guardar manualmente cuentas usando retain y release 11 Al contrario que el recolector de basura que funciona en tiempo de ejecucion el ARC elimina la sobrecarga de un proceso separado al gestionar la retencion de las cuentas El ARC y el manejo manual de memoria no son mutualmente excluyentes los programadores pueden continuar usando codigo no ARC en proyectos que tienen el ARC activado mediante la desactivacion del ARC para codigos fuente individuales Xcode tambien puede tratar de actualizar automaticamente un proyecto a ARC Literales Editar Los entornos de ejecucion NeXT y Apple Obj C incluyeron hace tiempo un atajo para crear nuevas cadenas usando la sintaxis literal una nueva cadena y tambien desecharon las constantes de CoreFoundation kCFBooleanTrue y kCFBooleanFalse por la variable NSNUmber con valores booleanos Al usar este formato se libera al programador de usar el mas largo initWithString o metodos similares al hacer ciertas operaciones Cuando se usa el compilador de Apple LLVM 4 0 o superior vectores diccionarios y numeros las clases NSAray NSDictionary y NSNumber pueden ser tambien creados usando sintaxis literal en lugar de metodos 15 La sintaxis literal usa el simbolo combinado con o para crear las clases mencionadas anteriormente respectivamente 16 Ejemplo sin literales NSArray miVector NSArray arrayConObjectos objeto1 objeto2 objeto3 nil NSDictionary miDiccionario1 NSDictionary diccionarioConObjeto unObjeto forKey llave NSDictionary miDiccionario2 NSDictionary diccionarioConObjetosYLlaves objeto1 llave1 objeto2 llave2 nil NSNumber miNumero NSNumber numeroConInt miInt NSNumber miNumeroSuma NSNumber numeroConInt 2 3 NSNumber miNumeroBooleano NSNumber numeroConBooleano YES Ejemplo con literales NSArray myVector objeto1 objeto2 objeto3 NSDictionary miDiccionario1 llave unObjeto NSDictionary miDiccionario2 llave1 objeto1 llave2 objeto2 NSNumber miNumero miInt NSNumber miNumeroSuma 2 3 NSNumber miNumeroBooleano YES Sin embargo al contrario que las cadenas literales que se compilan como constantes en el ejecutable estos literales se compilan como codigo equivalente a las llamadas a metodos mencionadas arriba En particular bajo manejo manual del conteo de referencia de memoria estos objetos son autoliberados lo que requiere especial cuidado cuando por ejemplo son usados con variables de funciones estaticas o otros tipos de variables globales Subindices Editar Cuando se usa el compilador de Apple LLVM 4 0 o superior vectores y diccionarios las clases NSArray y NSDictionary pueden ser manipuladas usando subindices 15 Los subindices se pueden usar para recuperar valores de indices vectores o llaves diccionarios y con objetos mutables tambien puede user para fijar objetos a indices o llaves En el codigo los subindices son representados usando corchetes 16 Ejemplos sin subindices id objeto1 unVector objectAtIndex 0 id objeto2 unDiccionario objectForKey llave unVectorMutable replaceObjectAtIndex 0 withObject objeto3 unDiccionarioMutable setObject objeto4 forKey llave Ejemplos con subindices id objeto1 unVector 0 id objeto2 unDiccionario llave unVectorMutable 0 objeto3 unDiccionarioMutable llave objeto4 Sintaxis de Objective C Moderna 1997 Editar Tras la compra de NeXT por parte de Apple se hicieron varios intentos para asemejar mas el lenguaje con respecto a otros lenguajes existentes Uno de estos intentos fue la introduccion de lo que se denomino en su momento Sintaxis moderna para Objective C en oposicion a la existente sintaxis clasica No habia cambios en el comportamiento real simplemente era una sintaxis alternativa La invocacion a un metodo se hacia de este modo objeto MiClase alloc init objeto primeraEtiq param1 param2 Y paso a escribirse de este otro modo objeto MiClase alloc init objeto primeraEtiq param1 segundaEtiq param2 Similarmente las declaraciones pasaron de ser asi void primeraEtiq int param1 int param2 a ser asi void primeraEtiq int param1 segundaEtiq int param2 Esta sintaxis moderna no esta soportada en dialectos actuales de Objective C Portable Object Compiler Editar Ademas de las implementaciones de GCC NeXT Apple que anadieron varias extensiones a la implementacion original de Stepstone tambien existe otra implementacion libre y abierta de Objective C llamada Protable Object Compiler 17 El conjunto de extensiones implementadas por el Portable Object Compiler difiere de las implementaciones GCC NeXT Apple en particular incluye blocks similares a los de Smalltalk para Objective C mientras que carece de protocolos y categorias dos caracteristicas usadas ampliamente en OpenStep y sus derivados En conjunto POC representa una etapa vieja pre NeXT de la evolucion del lenguaje simplemente conforme al libro de 1991 de Brad Cox Tambien incluye una libreria de tiempo de ejecucion llamada ObjectPak que esta basada en la libreria original ICPak101 de Cox que a su vez deriva de la libreria de clases Smalltalk 80 y es radicalmente diferente a la de OneStep FoundationKit GEOS Objective C Editar El sistema PC GEOS usaba un lenguaje de programacion conocido como GEOS Objective C o goc 18 a pesar de su similar nombre los dos lenguajes son similares en un concepto global y por el uso de palabras clave precedidas por el signo Clang Editar La suite de compiladores Clang parte del proyecto LLVM implementa Objective C asi como otros lenguajes Vease tambien EditarXcode Mac OS X Java Smalltalk C C Referencias Editar Introduccion a GNUstep en ingles Consultado el 10 de julio de 2014 Performance Comparisons of Common Operations Archivado desde el original el 1 de julio de 2009 Consultado el 19 de junio de 2019 Usando C con Objective C en ingles 19 de noviembre de 2008 Archivado desde el original el 31 de diciembre de 2008 Consultado el 10 de julio de 2014 Documentacion de Clang 3 5 Interoperabilidad con las lambdas de C 11 en ingles Consultado el 10 de julio de 2014 Dave Vasilevsky 10 de agosto de 2006 Objective C 2 0 mas pistas en ingles Archivado desde el original el 18 de junio de 2009 Consultado el 10 de julio de 2014 Dietmar Planitzer 9 de agosto de 2006 Re Objective C 2 0 en ingles Archivado desde el original el 24 de noviembre de 2010 Consultado el 10 de julio de 2014 a b Lanzamiento de la serie GCC 4 6 Cambios nuevas caracteristicas y arreglos en ingles Consultado el 10 de julio de 2014 Apple API del recolector de basura en ingles Consultado el 10 de julio de 2014 Apple Introduccion al recolector de basura en ingles Consultado el 10 de julio de 2014 Apple 6 de noviembre de 2007 Tecnologia Leopard para desarrolladores Resumen de Objective C 2 0 en ingles Archivado desde el original el 24 de julio de 2010 Consultado el 10 de julio de 2014 a b Apple 17 de julio de 2012 Notas de la transicion a ARC en ingles Consultado el 10 de julio de 2014 Mike Ash 27 de septiembre de 2013 ARM64 y tu en ingles Consultado el 10 de julio de 2014 SealieSoftware com 24 de septiembre de 2013 Objective C explicado ISA no es un puntero en ingles Consultado el 10 de julio de 2014 Apple 8 de marzo de 2011 Programacion en Blocks en ingles Consultado el 10 de julio de 2014 a b Apple Programando con Objective C Valores y colecciones en ingles Consultado el 10 de julio de 2014 a b Clang Literales de Objective C en ingles Consultado el 10 de julio de 2014 Portable Object Compiler en ingles Consultado el 10 de julio de 2014 GEOS SDK en ingles Consultado el 10 de julio de 2014 Enlaces externos EditarPagina de Apple sobre Objective C Comunidad de programadores Mac OS X El lenguaje Objective C para programadores C y Java Hola Mundo en Objective C para el iPhone Datos Q188531 Multimedia Objective C Obtenido de https es wikipedia org w index php title Objective C amp oldid 125248360, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos