Objective-C ++ Editar
Objective-C ++ é uma variante de idioma aceita pela interface da colecção do compilador GNU e clang, que pode compilar Arquivos do código-fonte que usam uma combinação de sintaxe C ++ e ObjectCtive-c. Objetivo-C ++ adiciona a C ++ As extensões que Objective-C adiciona a C. No entanto, como nada é feito para unificar a semântica por trás das características de várias línguas, há certas restrições:
- Um tipo de C ++ não pode derivar de uma classe e vice-versa do objetivo-C.
- c ++ não pode ser declarado dentro de uma instrução Objective-c.
- declarações objetivas -C deve aparecer globalmente, não dentro de uma instrução C ++.
- classes Objective-C não pode ter classes de C ++ variáveis que não possuem um construtor padrão ou têm um ou mais métodos virtuais, mas c ++ Os ponteiros de objeto podem ser usados como instâncias variáveis sem restrição (elas são atribuídas no método -init).
- C ++ semântica “por valor” não pode ser aplicado a objetos de Objective-C, que só são acessíveis por ponteiros.
- uma instrução Objective-C não pode ser NTRO de um modelo de declaração C ++ e vice-versa. No entanto, os tipos de Objective-C (como a ClasseName *) podem ser usados como parâmetros de modelo C ++.
- Objetivo-C e C ++ O manuseio de exceção é diferente; Cada idioma só pode lidar com suas próprias exceções. Isso é mitigado nas versões recentes ou substituindo completamente as exceções do objetivo-C por exceções C ++ (como a Apple), ou parcialmente quando a biblioteca Objetivo-C ++ está vinculada.
- Há para ser cuidadoso Como as chamadas para o destruidor de exceções de execução do Objective-C e C ++ não correspondem (por exemplo, um destruidor C ++ não será chamado quando uma exceção de objetivo-C sai do escopo de um objeto C ++). As novas versões de 64 bits resolvem isso introduzindo a interoperabilidade com as exceções de C ++ a este respeito.
- Blocks Objetivo-C e C ++ Lambords 11 são entidades diferentes, no entanto, um bloco é gerado de forma transparente Mac OS X quando um lambda é passado onde um bloco é esperado.
Objective-C 2.0editar
na conferência de 2006 em todo o mundo, a Apple anunciou o lançamento de ” Objective-C 2.0 “, uma revisão da linguagem Objective-C para incluir” uma moderna coleta de lixo, melhorias de sintaxe, melhoria de execução e suporte para 64 bits “. O Mac OS X V10.5, lançado em outubro de 2007, incluiu um compilador Objective-C 2.0. O GCC 4.6 suporta muitos novos aplicativos Objective-C, como propriedades declaradas e sintetizadas, sintaxe de pontos, enumeração rápida, métodos de protocolo opcionais, métodos de protocolo / protocolo / atributos de classe, extensões de classe e uma nova API do GNUNN Objective-C.
Preguiçamentação do lixo
Objectivo 2.0 tinha um coletor de lixo conservador opcional. Quando foi executado no modo de retração, ele mudou as operações de contagem de referência, como “reter” e “livre” no NOPS (não operações, instruções de montagem indicando que o processador não precisa fazer nada). Todos os objetos foram submetidos ao coletor de lixo quando a coleta de lixo foi ativada. Os ponteiros C podem ser qualificados com “__strong” para causar a interceptação da escrita do compilador e, assim, participar de coleta de lixo. Um subsistema fraco de zeramento também foi fornecido de forma que os ponteiros marcados com “__weak” foram definidos como zero quando o objeto (ou mais facilmente, a memória do coletor de lixo) é coletada. O coletor de lixo não existia na implementação do Objective-C 2.0 do IOS. A coleta de lixo no Objective-C é executada em um fio de baixa prioridade e pode parar os eventos do usuário, com a intenção de manter a experiência do usuário receptivo.
Garbage Collection nunca foi disponível no iOS devido a problemas de desempenho. Foi desprezado na versão 10.8 do OS X em favor da contagem de referência automática (em inglês: contagem automática de referência, arco) e está programado para ser excluído em uma versão futura do OS X. Objective-C no iOS 7 executado no ARM64 USA 19 bits de uma palavra de 64 bits para armazenar a contagem de referência, como um formulário de ponteiro rotulado.
PropertyRitar
Objectivo 2.0 Digite uma nova sintaxe para declarar variáveis de instância como propriedades, com Atributos opcionais para configurar a geração de métodos de acesso.As propriedades são, em certo sentido, variáveis de instância pública; Ou seja, declarando uma variável de instância como propriedade fornece classes de acesso externas (possivelmente limitadas, como apenas ler) para essa propriedade. Uma propriedade pode ser declarada como “ReadOnly” (somente leitura) e pode ser fornecido com semântica de armazenamento como “Atribuir” (Atribuir), “Copiar” (Copiar) ou “Reter” (retenha). Por padrão, as propriedades são consideradas atômicas, o que resulta em seguro para impedir vários encadeamentos que acessam ao mesmo tempo. Uma propriedade pode ser declarada como “não atômica” (não atômica), que elimina esse seguro.
@interface Persona : NSObject { @public NSString *nombre; @private int edad;}@property(copy) NSString *nombre;@property(readonly) int edad;-(id)iniciarConEdad:(int)edad;@end
As propriedades são implementadas pela palavra-chave @synthesize, que gera os métodos do Get5 (e setter, se eles não são somente leitura) de acordo com a instrução Property. Como alternativa, os métodos Getter e Setter devem ser implementados explicitamente, ou a palavra-chave @Dynamic pode ser usada para indicar que os métodos de acesso devem ser fornecidos por outros meios. Quando compilado usando o clang 3.1 ou superior, todas as propriedades que não são explicitamente declaradas com @dynamic
não são verificadas readonly
ou não tem os métodos completos Implementado pelo usuário getter
e setter
, será declarado automaticamente @synthesize
implicitamente.
@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 propriedades podem ser acessadas usando a sintaxe de passagem de mensagem tradicional, notat por pontos ou, no valor de codificação chave, 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);
de modo que o uso de pontos de notação invoca as propriedades de acesso em um método de instância, deve ser utilizado a palavra-chave “eu”:
-(void) presentarmeConPropiedades:(BOOL)useGetter { NSLog(@"Hola, mi nombre es %@.", (useGetter ? self.nombre : nombre));// NOTA: getter vs. acceso ivar}
As propriedades de classe ou protocolo podem ser intromecionadas dinamicamente.
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);}
Variáveis de instância não fragilhadas
Objective-C 2.0 fornece variáveis de instâncias não frágeis suportadas pelo ambiente de execução (por exemplo, criando código para um Mac OS X de 64 bits, bem como código para todos os iOS). Sob o ambiente de execução moderna, uma camada extra de viés é adicionada para instanciar variáveis de acesso, permitindo que o ligador dinâmico ajuste o plano de instanciação no tempo de execução. Esta propriedade permite que duas grandes melhorias no código Objective-C:
- elimina o problema da fragilidade das interfaces binárias – as superclasses podem alterar seu tamanho sem afetar a compatibilidade binária.
- Permite as variáveis de instância que fornecem retração para propriedades podem ser sintetizadas no tempo de execução sem serem declaradas na interface de classe.
enumeração rápida
em vez de usar um nsenumerator Objeto ou indicando a iteração em uma coleção, o Objective-C 2.0 oferece a sintaxe de enumeração rápida. No Objectivo-C 2.0, os seguintes loops são equivalentes funcionalmente, mas têm diferentes recursos de desempenho.
// 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.", , );}
enumeração rápida gera código mais eficiente do que a enumeração padrão, porque as chamadas para os métodos para listar Os objetos são substituídos por aritmética ponteiro usando o protocolo NSFastEumeration.
Sension livre
Uma extensão de classe tem a mesma sintaxe como uma declaração de categoria sem categoria e os métodos e propriedades declaradas nele são adicionadas diretamente para a classe main
. É usado principalmente como uma alternativa a uma categoria adicionando métodos a uma classe sem declará-las em cabeçalhos públicos, com a vantagem de que as extensões de classe o compilador verifique que todos os métodos orgulhosamente declarados são realmente implementados.
blockseditar
blocos é uma extensão não padrão para Objective-C (bem como para C e C ++) que usa uma sintaxe Especial para criar fechamentos. Blocos só são suportados no Mac OS X 10.6 “Snow Leopard” ou superior e no iOS 4 ou superior, bem como em Gnustep com libobjc2 1.7 e compilado com 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*/
Objetivo moderno-Ceditar
contagem de referência automáticaDitar
contagem de referência automática (Contagem de referência automática, arco) é um recurso de tempo de compilação que elimina a necessidade de programadores para salvar manualmente as contas usando retain
e release
Ao contrário do coletor de lixo, que funciona no tempo de execução, o arco elimina a sobrecarga de um processo separado, gerenciando a retenção das contas. O handling de memória manual não é mutuamente exclusivo; Os programadores podem continuar usando nenhum código de arco em projetos que possuem arco ativado desativando o arco para códigos de origem individuais. O Xcode também pode tentar atualizar automaticamente um projeto para o arco.
literaleseditar
Os próximos e Apple Obj-C Executando ambientes Algum tempo atrás um atalho para novas cadeias, usando a sintaxe literal @"una nueva cadena"
e também descartou as constantes de coreFoution kCFBooleanTrue
e kCFBooleanFalse
pela variável NSNUmber
com valores booleanos. Ao usar este formato, ele é liberado para o programador usar os métodos mais longos /div> ou similar ao fazer determinadas operações.
Quando o compilador da Apple LLVM 4.0 é usado ou superior, vetores, dicionários e números (classes NSAray
, NSDictionary
e NSNumber
) pode ser criado usando a sintaxe literal de métodos. A sintaxe literal usa o símbolo @
Combinado com ,
{}
ou ()
para criar as classes acima mencionadas, respectivamente.
Exemplo sem literal:
NSArray *miVector = ;NSDictionary *miDiccionario1 = ;NSDictionary *miDiccionario2 = ;NSNumber *miNumero = ;NSNumber *miNumeroSuma = ;NSNumber *miNumeroBooleano = ;
exemplo com literais:
NSArray *myVector = @;NSDictionary *miDiccionario1 = { @"llave" : unObjeto };NSDictionary *miDiccionario2 = { llave1: objeto1, llave2: objeto2 };NSNumber *miNumero = @{miInt};NSNumber *miNumeroSuma = @{2+3};NSNumber *miNumeroBooleano = @YES;
No entanto, ao contrário das cadeias literais que são compiladas como constantes no executável, esses literais são compilados como um código equivalente a chamadas para os métodos mencionados acima. Em particular, sob manuseio manual da contagem de referência de memória, esses objetos são auto-biberados, o que requer cuidados especiais quando, por exemplo, são usados com variáveis de funções estáticas ou outros tipos de variáveis globais.
subscrito / H4>
Quando o compilador da Apple LLVM 4.0 ou superior, vetores e dicionários (classes NSArray
e NSDictionary
) podem ser manipulados usando subscritos. Os subscritos podem ser usados para recuperar valores de índice (vetores) ou chaves (dicionários) e objetos mutáveis também podem ser usados para definir objetos para índices ou chaves. No código, os subscritos são representados usando colchetes .
exemplos sem subscritos:
Exemplos com subscritos:
id objeto1 = unVector;id objeto2 = unDiccionario;unVectorMutable = objeto3;unDiccionarioMutable = objeto4;
Objective-c “moderna” sintaxe (1997) Editar
Após a compra do próximo pela Apple, várias tentativas foram feitas para tornar a linguagem mais com relação a outros idiomas existentes. Uma dessas tentativas foi a introdução do que foi chamado de “sintaxe moderna” na época do Objective-C (em oposição à sintaxe existente e “clássica”). Não houve alterações no comportamento real, foi simplesmente uma sintaxe alternativa. A invocação a um método foi feita desta forma:
objeto = (MiClase.alloc).init;objeto.primeraEtiq ( param1, param2 );
e aconteceu de ser escrito nesse sentido:
objeto = init];;
Da mesma forma, as declarações se tornaram assim:
-(void) primeraEtiq ( int param1, int param2 );
para ser assim:
-(void) primeraEtiq: (int)param1 segundaEtiq: (int)param2;
Esta sintaxe “moderna” não é suportada nos dialetos atuais ObjectCtive-C.
Objeto portátil CompilereditarRitar
Além das implementações de GCC / Next / Apple, que Adicionado várias extensões à implementação do Stepstone original, há também outra implementação livre e aberta do Objective-C chamado compilador de objetos protetos. O conjunto de extensões implementado pelo compilador de objetos portáteis difere das implementações GCC / Next / Apple; Em particular, inclui blocos semelhantes aos do SmallTalk para Objectivo-C, sem protocolos e categorias, duas características amplamente utilizadas no Openstep e seus derivados. Juntos, o POC representa um estágio antigo, pré-seguinte, da evolução da linguagem, simplesmente de acordo com o livro de 1991 de Brad Cox.
também inclui uma biblioteca de tempo de execução chamada ObjectPak, que é baseado no ICPak101 original. Biblioteca de Cox (que por sua vez deriva da Biblioteca de Classe Smalltalk-80) e é radicalmente diferente do OneStep FoundationKit.
Geos Objetivo-Ceditar
O sistema de PC Geos usou uma linguagem de programação conhecida como Geos Objective-C ou GC; Apesar de seu nome similar, as duas línguas são semelhantes em um conceito global e pelo uso de palavras-chave precedidas pelo sinal @.
clangeditar
a suíte do compilador clang, parte de O projeto LLVM, implementa o Objective-C, bem como outros idiomas.