Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Portada
Portal de la comunidad Objective-C
Actualidad
Cambios recientes Objective-C es un lenguaje de
Páginas nuevas
Página aleatoria
programación orientado a objetos Objective-C
creado como un superconjunto de C
Ayuda
Información general
Donaciones para que implementase un modelo de
Paradigma orientado a objetos
Notificar un error objetos parecido al de Smalltalk.
Apareció en 1980
Originalmente fue creado por Brad Cox
Imprimir/exportar Diseñado por Brad Cox
y la corporación StepStone en 1980. En
Crear un libro Sistema de tipos fuerte, estático
1988 fue adoptado como lenguaje de
Descargar como PDF Implementaciones numerosas
programación de NEXTSTEP y en 1992
Versión para imprimir Influido por C, Smalltalk
fue liberado bajo licencia GPL para el Ha influido a Objective-C++, Java
En otros proyectos compilador GCC. Actualmente se usa [editar datos en Wikidata]
Wikimedia Commons como un lenguaje principal de
programación para Mac OS X, iOS y GNUstep, además de Swift.
Herramientas
Historia [ editar ]
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 sólo 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 1998, 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.
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.
Sintaxis [ editar ]
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;
}
Mensajes [ editar ]
Enviar el mensaje method al objeto apuntado por el puntero obj requeriría el siguiente
código en C++:
obj->method(parameter);
[obj method:parameter];
Interfaz [ editar ]
-(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.
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.
Implementación [ editar ]
@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);
}
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 [ 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 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:
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 [ editar ]
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.
- (void)setMyValue:(id)foo;
- (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;
- (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 [ editar ]
métodos de reenvío:
métodos de acción:
Ejemplo [ editar ]
Aquí hay un ejemplo de un programa que demuestra las bases del reenvío.
Forwarder.h
# import <objc/Object.h>
// Métodos de acceso
- (id)recipient;
- (id)setRecipient:(id)_recipient;
@end
Forwarder.m
# import "Forwarder.h"
@implementation Forwarder
- (id)setRecipient:(id)_recipient {
[recipient autorelease];
recipient = [_recipient retain];
return self;
}
- (id) recipient {
return recipient;
}
@end
Recipient.h
# import <objc/Object.h>
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];
[recipient release];
[forwarder release];
return 0;
}
Notas [ editar ]
& ./a.out
Objective-C++ [ editar ]
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:
Propiedades [ editar ]
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 sólo 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.
-(id)iniciarConEdad:(int)edad;
@end
@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
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
}
int i;
int contadorPropiedades = 0;
objc_propiedad_t *listaPropiedades =
clase_copiarListaPropiedades([unaPersona class],
&contadorPropiedades);
// Usando NSEnumerator
NSEnumerator *enumerador = [laGente objectEnumerator];
Persona *p;
// Usando índices
for (int i = 0; i < [laGente count]; i++) {
Persona *p = [laGente objectAtIndex:i];
NSLog(@"%@ tiene %i años.", [p nombre], [p edad]);
}
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 [ editar ]
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 sólo 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)();
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());
return 0;
}
/* Output:
First call: 5
Second call: 7
Third call: 9
*/
Literales [ editar ]
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.
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 [ 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 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
id objeto1 = unVector[0];
id objeto2 = unDiccionario[@"llave"];
unVectorMutable[0] = objeto3;
unDiccionarioMutable[@"llave"] = objeto4;
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 );
a ser así:
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.
Clang [ editar ]
La suite de compiladores Clang, parte del proyecto LLVM, implementa Objective-C así
como otros lenguajes.
Xcode.
Mac OS X.
Java.
Smalltalk.
C.
C++.
Referencias [ editar ]
Se editó esta página por última vez el 13 dic 2017 a las 04:09.
El texto está disponible bajo la Licencia Creative Commons Atribución Compartir Igual 3.0; pueden aplicarse
cláusulas adicionales. Al usar este sitio, usted acepta nuestros términos de uso y nuestra política de privacidad.
Wikipedia® es una marca registrada de la Fundación Wikimedia, Inc., una organización sin ánimo de lucro.