Objective-C (Galego)

Obxectivo-C ++ Editar

Objective-C ++ é unha variante de idioma aceptada pola interface da recollida do compilador GNU e clang, que pode compilar Arquivos do código fonte que utilizan unha combinación de sintaxe de C ++ e Objecttective-C. Objective-C ++ engade a C ++ as extensións que Obxectivo-C engádese a C. Como nada se fai para unificar a semántica detrás das características de varios idiomas, hai certas restricións:

  • Unha especie de C ++ non pode derivar dunha clase de obxectivos e viceversa.
  • Os espazos de nomes de C ++ non poden ser declarados dentro dunha declaración de obxectivos.
  • declaracións obxectivas -C debe aparecer globalmente, non dentro dunha declaración de C ++.
  • Obxectivo-C Clases non pode ter clases de C ++ variable que non teñan un constructor por defecto ou que teña un ou máis métodos virtuais, pero c Os punteiros de obxecto ++ poden ser utilizados como instancias variables sen restrición (son asignados no método -init).
  • C ++ Semántica “por valor” non se pode aplicar a obxectos de Obxectivo-C, que só son accesibles por punteiros.
  • Unha declaración obxectiva-C non pode ser NTRO dun modelo de declaración de C ++ e viceversa. Non obstante, os tipos de obxectivos-C (como a clase *) poden ser utilizados como parámetros de modelo de C ++.
  • O manexo de excepción Objective-C e C ++ é diferente; Cada lingua só pode manexar as súas propias excepcións. Isto é mitigado en versións recentes ou substituír por completo as excepcións de Obxectivo-C por excepcións C ++ (como Apple) ou parcialmente cando a biblioteca de obxectivos-C ++ está ligada.
  • hai que ter coidado Dado que as chamadas ao destrutor das excepcións de execución Objective-C e C ++ non coinciden (por exemplo, non se chamará un destrutor de C ++ cando unha excepción obxectiva-C sae do alcance dun obxecto C ++). As novas versións de 64 bits resolven isto introducindo a interoperabilidade coas excepcións de C ++ a este respecto.
  • Os bloques obxectivos-C e C ++ Lambords 11 son entidades diferentes, pero un bloque está xerado por un bloque Mac OS X Cando se aproba un lambda onde se espera un bloque.

Objective-C 2.0Editar

Na Conferencia de Desenvolvedores de 2006 en 2006, Apple anunciou o lanzamento de ” Objective-C 2.0 “, unha revisión do idioma Obxectivo-C para incluír” unha moderna recolección de lixo, melloras de sintaxe, mellora de execución e soporte para 64 bits “. Mac VOS X V10.5, lanzado en outubro de 2007, incluíu un compilador Obxectivo-C 2.0. GCC 4.6 soporta moitas novas aplicacións de obxectivos, como as propiedades declaradas e sintetizadas, sintaxe de puntos, enumeración rápida, métodos de protocolo opcionais, métodos / protocolo / atributos de clase, extensións de clase e unha nova API de Gnunn Object

Garamentación de lixo

Obxectivo 2.0 tivo un colector de lixo conservador opcional. Cando foi executado en modo de retracción, cambiou as operacións de conta de referencia, como “reter” e “libre” en NOPS (non operacións, instrucións de montaxe que indican que o procesador non ten que facer nada). Todos os obxectos foron sometidos ao colector de lixo cando a recollida de lixo foi habilitada. Os punteiros C poderían estar cualificados con “__strong” para causar a interceptación de escritura do compilador e así participar na recollida de lixo. Tamén se proporcionou un subsistema débil de cero de tal xeito que os punteiros marcados con “__weak” foron definidos como cero cando o obxecto (ou máis facilmente, recóllese a memoria do colector de lixo). O coleccionista de lixo non existía na implementación de Obxectivo-C 2.0 de iOS. A recollida de lixo en Objective-C execútase nun fío de baixa prioridade e pode deter os eventos do usuario, coa intención de manter a experiencia do usuario receptivo.

A colección de lixo nunca foi dispoñible en iOS debido a problemas de rendemento. Foi desprezado na versión 10.8 de OS X a favor do reconto de referencia automático (en inglés: Counting de referencia automático, ARC) e está programado para ser eliminado nunha futura versión de OS X. Obxectivo-C en iOS 7 executado en ARM64 EUA 19 bits dunha palabra de 64 bits para almacenar o reconto de referencia, como un formulario de punteiro etiquetado.

Propertyeditar

Obxectivo 2.0 Introduza unha nova sintaxe para declarar as variables de instancia como propiedades, con Atributos opcionais para configurar a xeración de métodos de acceso.As propiedades son, en certo sentido, variables de instancia pública; É dicir, declarar unha variable de instancia como propiedade proporciona clases de acceso externo (posiblemente limitadas, como a lectura) a esa propiedade. Unha propiedade pode ser declarada como “lectura” (só lectura) e pode ser proporcionada con semántica de almacenamento como “asignar” (asignar), “copiar” (copiar) ou “reter” (reter). Por defecto, as propiedades son consideradas atómicas, que dan como resultado o seguro para evitar varios fíos que o accedan ao mesmo tempo. Unha propiedade pode ser declarada como “nonatómica” (non 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

As propiedades son implementadas pola palabra clave @Synthesize, que xera os métodos de Getter (e Setter, se non son só de lectura) segundo a declaración de propiedade. Alternativamente, os métodos de Getter e Setter deben ser implementados de forma explícita ou a palabra clave @dynamic pode usarse para indicar que os métodos de acceso deben ser proporcionados por outros medios. Cando se compila usando Clang 3.1 ou superior, todas as propiedades que non están declaradas explícitamente con @dynamic non están marcadas readonly ou non teñen os métodos completos implementado polo usuario getter e setter, será declarado automaticamente @synthesize implícitamente.

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

As propiedades pódense acceder a través da sintaxe de pasaxe de mensaxes tradicional, notat por puntos ou, en valor de codificación clave, usando o / setValue:forKey.

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

Para que o uso da notación de puntos invoca as propiedades de acceso nun método de instancia, debe usarse a palabra clave “auto”:

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

Unha clase ou protocolo propiedades poden ser introspecionadas dinámicamente.

int i;int contadorPropiedades = 0;objc_propiedad_t *listaPropiedades = clase_copiarListaPropiedades(, &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);}

As variables de instancia non fráxiles

Objective-C 2.0 proporcionan variables de instancia non fráxiles soportadas polo ambiente de execución (por exemplo, creando código para un Mac OS X de 64 bits, así como código para todos os iOS). Baixo o ambiente de execución moderno, engádese unha capa adicional de prexuízo para as variables de acceso de instanciado, permitindo que o enlace dinámico axuste o plan de instanciación en tempo de execución. Esta propiedade permite dúas grandes melloras no código Obxectivo-C:

  • Elimina o problema da fragilidade das interfaces binarias: as superclases poden cambiar o seu tamaño sen afectar a compatibilidade binaria.
  • Permite que as variables de instancia que proporcionen a retracción das propiedades poden ser sintetizadas no horario de execución sen declararse na interface de clase.

Enumeración rápida

No canto de usar un Nsenumerator Obxecto ou indicando a iteración sobre unha colección, Objective-C 2.0 ofrece a sintaxe rápida de enumeración. En Objective-C 2.0, os seguintes loops son funcionalmente equivalentes, pero teñen diferentes funcións de rendemento.

// Usando NSEnumeratorNSEnumerator *enumerador = ;Persona *p;while ((p = ) != nil) { NSLog(@"%@ tiene %i años.", , );}

// Usando índicesfor (int i = 0; i < ; i++) { Persona *p = ; NSLog(@"%@ tiene %i años.", , );}

// Using enumeración rápidafor (Persona *p in laGente) { NSLog(@"%@ tiene %i años.", , );}

A enumeración rápida xera un código máis eficiente que a enumeración estándar porque as chamadas aos métodos para a lista Os obxectos son substituídos por aritmética do punteiro usando o protocolo de NSFasteumerumerum.

SENSIDENA GRATUÍTA

Unha extensión de clase ten a mesma sintaxe que unha declaración de categoría sen categoría e os métodos e propiedades declaradas no que se engaden directamente á clase main. Utilízase principalmente como unha alternativa a unha categoría engadindo métodos a unha clase sen declararlles en encabezados públicos, coa vantaxe de que para as extensións de clase o compilador verifica que todos os métodos orgullosos declarados están realmente implementados.

Blocleeditar

Artigo principal: Bloques (extensión da linguaxe C)

bloques é unha extensión non estándar para Objective-C (así como para C e C ++) que usa unha sintaxe Especial para crear peche. Os bloques só están soportados en Mac OS X 10.6 “Snow Leopard” ou superior e en iOS 4 ou superior, así como en Gnustep con Libobjc2 1.7 e compilado con Clang 3.1 ou superior.

#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: 5Second call: 7Third call: 9*/

Obxectivo moderno-ceditar

reconto automático de referenciaditar

Conta de referencia automática (Contar de referencia automática, ARC) é unha característica de tempo de compilación que elimina a necesidade de que os programadores aforran contas manualmente usando retain e release A diferenza do recolector de lixo, que funciona en tempo de execución, o ARC elimina a sobrecarga dun proceso separado xestionando a retención das contas. O arc e manual manual de manipulación non son mutuamente exclusivos; Os programadores poden seguir utilizando ningún código de arco en proxectos que teñan ARC activado por desactivar o arco para códigos de orixe individual. Xcode tamén pode tratar de actualizar automaticamente un proxecto ao arco.

literaleseditar

Os contornos de execución do próximo e de Apple obj-C hai algún tempo un atallo para as novas cadeas, usando a sintaxe literal @"una nueva cadena" e tamén descartou as constantes de corefoutación kCFBooleanTrue e kCFBooleanFalse pola variable NSNUmber con valores booleanos. Ao usar este formato, publícase ao programador para usar os métodos máis longos ou similares ao facer determinadas operacións.

Cando se usa o compilador de Apple LLVM 4.0 ou superior, Vectores, dicionarios e números (clases NSAray, NSDictionary e NSNumber) pódese crear tamén usando sintaxe literal no seu lugar de métodos. A sintaxe literal usa o símbolo @ combinado con , {} ou para crear as clases mencionadas, respectivamente.

exemplo sen literal:

NSArray *miVector = ;NSDictionary *miDiccionario1 = ;NSDictionary *miDiccionario2 = ;NSNumber *miNumero = ;NSNumber *miNumeroSuma = ;NSNumber *miNumeroBooleano = ;

Exemplo con literais:

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

Con todo, a diferenza das cadeas literarias que se compilan como constantes no executable, estes literales son compilados como un código equivalente a chamadas a métodos mencionados anteriormente. En particular, baixo manipulación de conta de referencia de memoria, estes obxectos son auto-biberate, que require coidados especiais cando, por exemplo, son usadas con variables de funcións estáticas ou outros tipos de variables globais.

SubscriptingEditar

Cando o Apple LLVM 4.0 ou o compilador superior, os vectores e os dicionarios (clases NSArray e NSDictionary) pódense manipular usando Subscritos. Os subíndices poden ser utilizados para recuperar os valores do índice (vectores) ou as chaves (dicionarios) e obxectos mutables tamén se poden usar para establecer obxectos a índices ou claves. No código, os subíndices están representados usando corchetes .

Exemplos sen subíndices:

id objeto1 = ;id objeto2 = ;;;

Exemplos con subíndices:

id objeto1 = unVector;id objeto2 = unDiccionario;unVectorMutable = objeto3;unDiccionarioMutable = objeto4;

Objective-C “Modern” Syntax (1997) Editar

Despois da compra de A continuación por Apple, fixéronse varios intentos para facer a linguaxe máis con respecto a outros idiomas existentes. Un destes intentos foi a introdución do que se chamaba “sintaxe moderna” no momento para Objective-C (en oposición á sintaxe existente, “clásica”). Non houbo cambios no comportamento real, era simplemente unha sintaxe alternativa. A invocación a un método foi feito deste xeito:

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

e pasou a escribirse de forma demais:

objeto = init];;

Do mesmo xeito, as declaracións fíxose así:

para ser así:

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

Esta sintaxe “moderna” non está soportada nos dialectos de obxectivos actuais.

compilación de obxectos portátiles

Ademais das implementacións de GCC / Seguinte / Apple, que Engadiuse varias extensións á implementación orixinal de StefStone, tamén hai outra implementación gratuíta e aberta de Objective-C COMPILER COMPRILER PRODUTAR PORTABLE. O conxunto de extensións implementadas polo compilador de obxectos portátiles difire das implementacións GCC / Next / Apple; En particular, inclúe bloques similares aos de Smalltalk para Objective-C, ao carecer de protocolos e categorías, dúas características amplamente utilizadas en Openstep e os seus derivados. Xuntos, POC representa unha vella etapa, pre-próxima, da evolución da linguaxe, simplemente de acordo co libro de Brad Cox.

tamén inclúe unha biblioteca de execución chamada obxectora, que está baseada no ICPAK101 orixinal A biblioteca de COX (que á súa vez deriva da biblioteca de clase Smalltalk-80) e é radicalmente diferente á Fundación Ondep.

Geos Objective-Ceditar

O sistema de PC GEOS usou unha linguaxe de programación coñecida como GEOS Objective-C ou GOC; A pesar do seu nome similar, as dúas linguas son similares nun concepto global e mediante o uso de palabras clave precedidas polo sinal @.

clangeditar

a suite compiladora de clang, parte de O proxecto LLVM, implementa obxectivos-C, así como outras linguas.

Deixa unha resposta

O teu enderezo electrónico non se publicará Os campos obrigatorios están marcados con *