Obiettivo-C ++ Modifica
Obiettivo-C ++ è una variante della lingua accettata dall’interfaccia della collezione Compiler GNU e Clangg, che può compilare File dal codice sorgente che utilizza una combinazione di sintassi C ++ e Objective-c. Objective-C ++ aggiunge a C ++ Le estensioni che Obiettivo-C aggiungono a C. Poiché nulla è fatto per unificare la semantica dietro le caratteristiche di diverse lingue, ci sono alcune restrizioni:
- Una sorta di C ++ non può derivare da una classe Objective-C e viceversa.
- C ++ I nomi non possono essere dichiarati all’interno di un’istruzione Objective-C.
- dichiarazioni oggettive -C dovrebbe apparire a livello globale, non all’interno di un’istruzione C ++.
- Obiettivi-c lezioni non possono avere classi C ++ variabili che non dispongono di un costruttore predefinito o hanno uno o più metodi virtuali, ma c I puntatori di oggetti ++ possono essere utilizzati come istanze variabili senza restrizioni (sono assegnate nel metodo -init).
- c ++ semantica “per valore” non può essere applicato agli oggetti di obiettivi-C, che sono accessibili solo dai puntatori.
- Un’istruzione Objective-C non può essere NTRO di un modello di dichiarazione C ++ e viceversa. Tuttavia, i tipi di obiettivi-C (come CLASSNAME *) possono essere utilizzati come parametri del modello C ++.
- Obiettivo-C e C ++ Exception Handling è diverso; Ogni lingua può gestire solo le proprie eccezioni. Ciò viene mitigato nelle versioni recenti o sostituisce completamente le eccezioni dell’obiettivo-C di eccezioni C ++ (come Apple) o parzialmente quando la libreria Obiettivo-C ++ è collegata.
- C’è di stare attento Dal momento che le chiamate al distruttore delle eccezioni di esecuzione obiettivi-C e C ++ non corrispondono (ad esempio, un distruttore C ++ non verrà chiamato quando un’eccezione Obiettivo-c esce dall’ambito di un oggetto C ++). Le nuove versioni a 64 bit risolvono questo introducendo l’interoperabilità con le eccezioni di C ++ a questo proposito.
- Obiettivo-c Blocks e C ++ Lambords 11 sono diverse entità, tuttavia un blocco è generato in modo trasparente Mac OS X Quando viene superato una Lambda dove è previsto un blocco.
Obiettivo-C 2.0EDER
Alla Conferenza degli sviluppatori in tutto il mondo 2006, Apple ha annunciato il lancio di ” Objective-C 2.0 “, una revisione della lingua dell’obiettivo-C per includere” una moderna collezione di rifiuti, miglioramenti della sintassi, miglioramento dell’esecuzione e supporto per 64 bit “. Mac OS X V10.5, lanciato nell’ottobre 2007, ha incluso un compilatore Objective-C 2.0. GCC 4.6 supporta molte nuove applicazioni Objective-C, come proprietà dichiarate e sintetizzate, sintassi dei punti, enumerazione rapida, metodi di protocollo facoltativi, metodi di protocollo opzionale, attributi del metodo / protocollo / classe, estensioni di classe e una nuova API di Gnunn Objective-C.
Garmenting of Garbage
Obiettivo 2.0 ha avuto un raccoglitore di immondizia conservatori opzionale. Quando è stato eseguito in modalità di ritrazione, ha modificato le operazioni di conteggio di riferimento come “Conservare” e “GRATUITA” nei NOP (non operazioni, istruzioni di assemblaggio che indicano che il processore non deve fare nulla). Tutti gli oggetti sono stati sottoposti al Garbage Collector quando la raccolta di Garbage è stata abilitata. I puntatori possono essere qualificati con “__strong” per causare l’intercettazione della scrittura del compilatore e quindi partecipare alla raccolta della spazzatura. Un sottosistema debole di azzeramento è stato anche fornito in modo tale che i puntatori contrassegnati con “__Weak” siano stati impostati su zero quando viene raccolto l’oggetto (o più facilmente, la memoria del collettore di rifiuti). Il collezionista della spazzatura non esisteva nell’attuazione dell’obiettivo-C 2.0 di iOS. La raccolta della spazzatura in Objective-C viene eseguita in un thread prioritario basso e può interrompere gli eventi dell’utente, con l’intenzione di mantenere l’esperienza dell’utente ricettivo.
La raccolta dei rifiuti non è mai stata disponibile in iOS a causa di problemi di prestazione. È stato disprezzato nella versione 10.8 di OS X a favore del conteggio automatico di riferimento (in inglese: conteggio automatico di riferimento, ARC) ed è programmato per essere cancellato in una versione futura di OS X. Obiettivo-C in IOS 7 eseguito in ARM64 USA 19 bit di una parola a 64 bit per memorizzare il conteggio di riferimento, come un modulo di puntatore etichettato.
Interessibile
Obiettivo 2.0 Immettere una nuova sintassi per dichiarare le variabili di istanza come proprietà, con Attributi opzionali per configurare la generazione di metodi di accesso.Le proprietà sono, in un certo senso, le variabili dell’istanza pubblica; Cioè, dichiarando una variabile di istanza come una proprietà fornisce classi di accesso esterne (possibilmente limitate, come una semplice lettura) a quella proprietà. Una proprietà può essere dichiarata come “Readonly” (sola lettura) e può essere fornita con Semantica di storage come “Assegna” (Assegna), “Copia” (Copia) o “Conservare” (conservata). Per impostazione predefinita, le proprietà sono considerate atomiche, il che si traduce in un’assicurazione per prevenire più fili che accedono allo stesso tempo. Una proprietà può essere dichiarata come “non tomica” (non atomica), che elimina questa assicurazione.
@interface Persona : NSObject { @public NSString *nombre; @private int edad;}@property(copy) NSString *nombre;@property(readonly) int edad;-(id)iniciarConEdad:(int)edad;@end
Le proprietà sono implementate Dalla parola chiave @synthesize, che genera i metodi Gettter (e Setter, se non sono solo lettura) in base all’istruzione della proprietà. In alternativa, i metodi Getter e Setter devono essere implementati esplicitamente o la parola chiave @dynamic può essere utilizzata per indicare che i metodi di accesso devono essere forniti da altri mezzi. Se compilato utilizzando CLANG 3.1 o superiore, tutte le proprietà che non sono dichiarate esplicitamente con @dynamic
non vengono controllati readonly
o non hanno i metodi completi o non hanno i metodi completi Implementato dall’utente getter
e setter
, verrà dichiarato 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
Le proprietà sono accessibili utilizzando la tradizionale sintassi del passaggio del messaggio, notat per punti o, nel valore di codifica dei tasti, usando il / 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);
In modo che l’uso della notazione dei punti richiama le proprietà di accesso in un metodo di istanza, è necessario utilizzare la parola chiave “auto”:
-(void) presentarmeConPropiedades:(BOOL)useGetter { NSLog(@"Hola, mi nombre es %@.", (useGetter ? self.nombre : nombre));// NOTA: getter vs. acceso ivar}
Le proprietà di classe o di protocollo possono essere introspecizionate 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);}
variabili di istanza non fragiled
Objective-C 2.0 Fornire variabili di istanza non fragile supportate dall’ambiente di esecuzione (ad esempio, creando il codice per un Mac OS X di 64 bit e codice per tutti iOS). Sotto il moderno ambiente di esecuzione, viene aggiunto uno strato extra di bias per istanziare le variabili di accesso, consentendo al dinamico il collegamento di regolare il piano di istanziazione in fase di runtime. Questa proprietà consente a due grandi miglioramenti nel codice obiettivo-C:
- elimina il problema della fragilità delle interfacce binarie – le superclasse possono modificare le loro dimensioni senza influire sulla compatibilità binaria.
- Consente alle variabili di istanza che forniscono la retrazione per le proprietà possono essere sintetizzate nel tempo di esecuzione senza essere dichiarato nell’interfaccia di classe.
Enumerazione rapida
invece di usare un nsenumeratore Oggetto o indicare l’iterazione su una raccolta, Objective-C 2.0 offre la sintassi di enumerazione rapida. Nell’obiettivo-C 2.0, i seguenti anelli sono funzionalmente equivalenti, ma hanno diverse funzionalità di prestazione.
// 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.", , );}
L’enumerazione rapida genera codice più efficiente rispetto all’enumerazione standard perché le chiamate ai metodi da elencare Gli oggetti vengono sostituiti dall’aritmetico del puntatore utilizzando il protocollo di NSFasteMeration.
Sensibilità gratuita
Un estensione di classe ha la stessa sintassi di una dichiarazione di categoria senza categoria e sono aggiunti i metodi e le proprietà dichiarati Direttamente alla classe main
. È principalmente utilizzato come alternativa a una categoria aggiungendo metodi a una classe senza dichiararli in intestazioni pubbliche, con il vantaggio che per le estensioni di classe il compilatore verifica che tutti i metodi orgogliosi dichiarati siano effettivamente implementati.
BlockSeditar
Blocks è un’estensione non standard per l’obiettivo-C (nonché per C e C ++) che utilizza una sintassi Speciale per creare chiusure. I blocchi sono supportati solo in Mac OS X 10.6 “Snow Leopard” o superiore e superiore e in IOS 4 o superiore, così come in GnusTep con LIBOBJC2 1.7 e compilato con CLANG 3.1 o superiore.
#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*/
Modern Obiettivo-ceditar
conteggio automatico di riferimento di riferimento
conteggio automatico di riferimento (Count di riferimento automatico, ARC) è una funzione tempo di compilazione che elimina la necessità di programmare per salvare manualmente gli account utilizzando retain
e release
A differenza del collezionista della spazzatura, che funziona in fase di runtime, l’ARC elimina il sovraccarico di un processo separato gestendo la ritenzione dei conti. L’arco e la gestione della memoria manuale non sono reciprocamente esclusivi; I programmatori possono continuare a utilizzare nessun codice ARC in progetti che hanno ARC attivato disattivando l’arco per i singoli codici di origine. XCode può anche provare a aggiornare automaticamente un progetto su ARC.
Letteraleseditar
The Next e Apple OBJ-C Ambienti in esecuzione qualche tempo fa una scorciatoia per nuove catene, utilizzando la sintassi letterale @"una nueva cadena"
e ha anche scartato le costanti di corefoutitation kCFBooleanTrue
e kCFBooleanFalse
dalla variabile NSNUmber
con valori booleani. Quando si utilizza questo formato, viene rilasciato al programmatore per utilizzare i metodi più lunghi /div> o simili quando si esegue determinate operazioni.
Quando il compilatore Apple Llvm 4.0 è utilizzato o superiore, vettori, dizionari e dizionari Numeri (classi NSAray
, NSDictionary
e NSNumber
) può essere creato anche usando la sintassi letterale invece di metodi. La sintassi letterale utilizza il simbolo @
combinato con ,
{}
o ()
per creare rispettivamente le classi suddette.
Esempio senza letterale:
NSArray *miVector = ;NSDictionary *miDiccionario1 = ;NSDictionary *miDiccionario2 = ;NSNumber *miNumero = ;NSNumber *miNumeroSuma = ;NSNumber *miNumeroBooleano = ;
Esempio con i letterali:
NSArray *myVector = @;NSDictionary *miDiccionario1 = { @"llave" : unObjeto };NSDictionary *miDiccionario2 = { llave1: objeto1, llave2: objeto2 };NSNumber *miNumero = @{miInt};NSNumber *miNumeroSuma = @{2+3};NSNumber *miNumeroBooleano = @YES;
Tuttavia, a differenza delle catene letterale che vengono compilate come costanti nell’eseguibile, questi livelli sono compilati come codice equivalente alle chiamate ai metodi sopra menzionati. In particolare, sotto la gestione manuale del conteggio di riferimento della memoria, questi oggetti sono auto-biberati, che richiedono un’assistenza speciale quando, ad esempio, vengono utilizzati con variabili di funzioni statiche o altri tipi di variabili globali.
sottoscrittura
Quando il compilatore Apple Llvm 4.0 o superiore, vettori e dizionari (Classi NSArray
e NSDictionary
) può essere manipolato utilizzando pedici. I sottoscrittori possono essere utilizzati per recuperare valori indice (vettori) o tasti (dizionari) e oggetti mutabili possono anche essere utilizzati per impostare oggetti su indici o tasti. Nel codice, i sottoscript sono rappresentati utilizzando parentesi .
Esempi senza sottoscritture:
id objeto1 = ;id objeto2 = ;;;
Esempi con sottoscrittori:
id objeto1 = unVector;id objeto2 = unDiccionario;unVectorMutable = objeto3;unDiccionarioMutable = objeto4;
Obiettivo-c “Modern” Sintassi (1997) Modifica
Dopo l’acquisto di Avanti da Apple, sono stati effettuati diversi tentativi per rendere il linguaggio di più rispetto ad altre lingue esistenti. Uno di questi tentativi è stata l’introduzione di quella che è stata chiamata “Sintassi moderna” al momento dell’obiettivo-C (al contrario della sintassi “classica” esistente). Non c’erano cambiamenti nel comportamento effettivo, era semplicemente una sintassi alternativa. L’invocazione a un metodo è stata eseguita in questo modo:
objeto = (MiClase.alloc).init;objeto.primeraEtiq ( param1, param2 );
E è successo da scrivere in questo altro modo:
objeto = init];;
Allo stesso modo, le dichiarazioni sono diventate in questo modo:
-(void) primeraEtiq ( int param1, int param2 );
Per essere così:
-(void) primeraEtiq: (int)param1 segundaEtiq: (int)param2;
Questa sintassi “moderna” non è supportata nei dialetti Objective-C attuali.
Object portatile Compilerreditar
Oltre alle implementazioni di GCC / Avanti / Apple, che Aggiunti diverse estensioni all’implementazione StepStone originale, c’è anche un’altra implementazione gratuita e aperta di Objective-C chiamata Compilatore di oggetti Protable. Il set di estensioni implementato dal compilatore oggetto portatile differisce dalle implementazioni GCC / Avanti / Apple; In particolare, include blocchi simili a quelli di SmallTalk per gli obiettivi-C, mentre mancano protocolli e categorie, due funzionalità ampiamente utilizzate in OpenStep e i suoi derivati. Insieme, POC rappresenta un vecchio palcoscenico, pre-accanto, dell’evoluzione del linguaggio, semplicemente secondo il libro del 1991 di Brad Cox.
Include anche una libreria di runtime chiamata Objectpak, che si basa nell’Insorgente ICPAK101 Biblioteca di Cox (che a sua volta deriva dalla Biblioteca di classe SmallTalk-80) ed è radicalmente diversa dal FoundationKit Onestep.
GEOS Obiettivo-CEDITAR
Il sistema PC GEOS ha utilizzato un linguaggio di programmazione noto come GEOS Objective-C o GOC; Nonostante il suo nome simile, le due lingue sono simili in un concetto globale e con l’uso di parole chiave precede dal segno @.
clangeditar
la suite del compilatore CLANG, parte di Il progetto LLVM, implementa l’obiettivo-c e altre lingue.