Obiectiv-C

Obiectiv-C ++ Editare

Obiectiv-C ++ este o varianta lingvistica acceptata de interfața de colectare a compilatorului GNU si Clang, care se poate compila Fișiere din codul sursă care utilizează o combinație de sintaxa C ++ și Obiective-C. Obiectiv-C ++ adaugă la C ++ extensiile pe care obiectivul le adaugă la C. Deoarece nimic nu se face pentru a unifica semantica din spatele caracteristicilor mai multor limbi, există anumite restricții:

  • Un fel de C ++ nu poate fi derivă dintr-o clasă de obiectivă și invers.
  • C ++ spații de nume nu pot fi declarate într-o declarație de Obiectiv-C.
  • Declarații obiective -C ar trebui să apară la nivel global, nu într-o declarație C ++.
  • Clasele Obiectiv-C nu pot avea clase variabile C ++ care nu au un constructor implicit sau au una sau mai multe metode virtuale, dar C ++ Pointerii obiectelor pot fi utilizate ca instanțe variabile fără restricție (sunt atribuite în metoda -Init).
  • C ++ semantica „cu valoare” nu poate fi aplicată obiectelor de Obiectiv-C, care sunt accesibile numai de pointeri.
  • o declarație de obiectiv-C nu poate fi Ntro a unui șablon de declarație C ++ și viceversa. Cu toate acestea, tipurile de obiective-C (cum ar fi clasana *) pot fi utilizate ca parametri de șablon C ++.
  • Obiectiv-C și C ++ Manipularea excepțiilor este diferită; Fiecare limbă se poate ocupa doar de propriile sale excepții. Acest lucru este atenuat în versiunile recente sau înlocuirea completă a obiectivelor C ++ (cum ar fi Apple) sau parțial când biblioteca Obiectiv-C ++ este legată.
  • există atent Deoarece apelurile către distrugerea excepțiilor de execuție Obiectiv-C și C ++ nu se potrivesc (de exemplu, un distrugător C ++ nu va fi numit atunci când o excepție de Obiectiv-C iese din scopul unui obiect C ++). Noile versiuni pe 64 de biți rezolvă acest lucru prin introducerea interoperabilității cu excepțiile C ++ în această privință.
  • Obiectiv-C Blocuri și C ++ Lambords 11 sunt entități diferite, totuși un bloc este generat în mod transparent pe Mac OS X Când este trecut o lambda în cazul în care este de așteptat un bloc.

obiectiv-C 2.0editar

La Conferința dezvoltatorilor din întreaga lume din 2006, Apple a anunțat lansarea ” Obiectiv-C 2.0 „, o revizuire a limbii Obiectiv-C pentru a include” o colecție de gunoi modernă, îmbunătățiri de sintaxă, îmbunătățiri de execuție și suport pentru 64 de biți „. Mac OS X V10.5, lansat în octombrie 2007, a inclus un compilator de Obiectiv-C 2.0. GCC 4.6 acceptă multe noi aplicații Obiectiv-C, cum ar fi proprietățile declarate și sintetizate, sintaxa punctelor, enumerarea rapidă, metodele de protocol opționale, atributele de metodă / protocol / clasă, extensiile de clasă și un nou API Gnunn Obiectiv-C.

Îmbrăcăminte de gunoi

Obiectivul 2.0 a avut un colector de gunoi conservator opțional. Când a fost executat în modul de retragere, a schimbat operațiunile de numărare de referință, cum ar fi „reține” și „liber” în nops (non-operații, instruire asamblare care indică faptul că procesorul nu trebuie să facă nimic). Toate obiectele au fost supuse colectorului de gunoi când a fost activată colecția de gunoi. C Pointers ar putea fi calificați cu „__strong” pentru a provoca interceptarea de scriere a compilatorului și astfel participă la colectarea gunoiului. Un subsistem slab de zeroizare a fost, de asemenea, furnizat în așa fel încât indicatorii marcați cu „__weak”, au fost setate la zero atunci când se colectează obiectul (sau mai ușor, memoria colectorului de gunoi). Colectorul de gunoi nu a existat în implementarea Obiectiv-C 2.0 al iOS. Colecția de gunoi în Obiectiv-C este executată într-un fir cu prioritate scăzută și poate opri evenimentele utilizatorilor, cu intenția de a menține experiența utilizatorului receptiv.

Colecția de gunoi nu a fost niciodată disponibilă în iOS din cauza problemelor de performanță. A fost disprețuită în versiunea 10.8 din OS X în favoarea numărului de referință automată (în limba engleză: numărarea automată de referință, ARC) și este programată să fie eliminată într-o versiune viitoare a OS X. Obiectiv-C în iOS 7 executat în ARM64 SUA 19 biți ai unui cuvânt pe 64 de biți pentru a stoca numărul de referință, cum ar fi un formular de indicator marcat.

imobiliar

Obiectiv 2.0 Introduceți o nouă sintaxă pentru a declara variabilele de instanță ca proprietăți, cu Atribute opționale pentru a configura generarea metodelor de acces.Proprietățile sunt, într-un anumit sens, variabilele de instanță publice; Adică declararea unei variabile de instanță ca o proprietate oferă clase de acces extern (posibil limitate, cum ar fi doar citirea) la acea proprietate. O proprietate poate fi declarată drept „readonly” (numai pentru citire) și poate fi prevăzută cu semantica de stocare ca fiind „atribuiți”, „copie” (copie) sau „reținere” (rețin). În mod implicit, proprietățile sunt considerate atomice, ceea ce duce la asigurarea pentru a preveni mai multe fire care accesează în același timp. O proprietate poate fi declarată drept „non-atomică”, care elimină această asigurare.

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

Proprietățile sunt implementate Prin cuvântul cheie @synthesize, care generează metodele Getter (și setter, dacă nu sunt doar pentru citire) în conformitate cu declarația de proprietate. În mod alternativ, metodele GETTER și setter trebuie implementate în mod explicit sau cuvântul cheie @dynamic poate fi utilizat pentru a indica faptul că metodele de acces trebuie furnizate prin alte mijloace. Când sunt compilate cu Clang 3.1 sau mai mare, toate proprietățile care nu sunt declarate explicit cu @dynamic nu sunt verificate readonly sau nu au metodele complete Implementat de utilizatorul getter și setter va fi declarat automat @synthesize implicit.

@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

Proprietățile pot fi accesate utilizând sintaxa de trecere a mesajelor tradiționale, notat cu puncte sau, în valoare de codare cheie, utilizând / iv id = „22fb033214” .

astfel încât utilizarea notării punctelor invocă proprietățile de acces într-o metodă de instanță, trebuie folosit cuvântul cheie „sine”:

iv id = „DC69811337”

Proprietățile de clasă sau protocol pot fi introspecificate dinamic.

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);}

variabile de instanță ne-fragilate

obiectiv-C 2.0 furnizează variabile de instanță non-fragile susținute de mediul de execuție (de exemplu, crearea codului pentru un sistem de operare Mac X de 64 de biți, precum și codul pentru toate iOS). În cadrul mediului modern de execuție, se adaugă un strat suplimentar de părtinire pentru instanțiate variabilele de acces, permițând linkerului dinamic să ajusteze planul de instanțiere în timpul rulării. Această proprietate permite două mari îmbunătățiri în codul Obiectiv-C:

  • Elimină problema fragilității interfețelor binare – superclasele își pot schimba dimensiunea fără a afecta compatibilitatea binară.
  • Permite variabilelor de instanță care asigură retragerea pentru proprietăți pot fi sintetizate în timpul de funcționare fără a fi declarate în interfața de clasă.

enumerare rapidă

în loc să utilizați un nsenumator Obiect sau indicând iterația pe o colecție, Obiectiv-C 2.0 oferă sintaxa de enumerare rapidă. În Obiectiv-C 2.0, următoarele bucle sunt echivalente funcțional, dar au caracteristici de performanță diferite.

div>

// 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.", , );}

div id =” enumerare rapidă generează un cod mai eficient decât enumerarea standard, deoarece apelurile către metodele de listă Obiectele sunt înlocuite cu aritmetica pointerului utilizând protocolul NSFASTEURINCE.

o întindere liberă

O extensie de clasă are aceeași sintaxă ca o declarație de categorii fără categorie, iar metodele și proprietățile declarate în acesta sunt adăugate direct la clasa main. Este folosit în cea mai mare parte ca o alternativă la o categorie prin adăugarea de metode la o clasă fără a le declara în anteturile publice, cu avantajul că, pentru extensiile de clasă, compilatorul verifică că toate metodele declarate cu mândrie sunt efectiv implementate.

BlockEDITATAR

Articol principal: blocuri (extensie a limbii c)

Blocuri este o extensie nestandard pentru obiectiv-C (precum și pentru C și C ++) care utilizează o sintaxă Special pentru a crea închideri. Blocurile sunt acceptate numai în Mac OS X 10.6 „Snow Leopard” sau mai mare și în iOS 4 sau mai mare, precum și în GnUstep cu LibobJC2 1.7 și compilate cu Clang 3.1 sau mai mare.

#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*/

Obiectivul modern-Ceditar

Numărătoare automată de referințăDitare

Numărătoare de referință automată (Numărul de referință automat, ARC) este o funcție de timp de compilare care elimină necesitatea programatorilor de a salva manual conturile folosind retain și release Spre deosebire de colectorul de gunoi, care funcționează la Runtime, ARC elimină supraîncărcarea unui proces separat prin gestionarea retenției conturilor. Arcul și manipularea manuală a memoriei nu se exclud reciproc; Programatorii pot continua să utilizeze codul ARC în proiecte care au Arc activat prin dezactivarea Arcului pentru codurile sursă individuale. XCode poate încerca, de asemenea, să actualizeze automat un proiect la arc.

literaleseditar

Mediile de executare Următoare și Apple Obj-C cu ceva timp în urmă o comandă rapidă pentru lanțurile noi, utilizând sintaxa literală @"una nueva cadena" și, de asemenea, aruncat constante ale corefout-ului kCFBooleanTrue și kCFBooleanFalse de variabila NSNUmber cu valori booleene. Când utilizați acest format, este lansat programatorului pentru a utiliza cele mai lungi /div> sau metode similare atunci când faceți anumite operații.

Când se utilizează compilatorul Apple LLVM 4.0 sau superior, vectori, dicționare și dicționare și dicționare și Numere (clase NSAray 7f49bb4e „> și ) pot fi create și folosind sintaxa literală în schimb de metode. Sintaxa literală folosește simbolul @ combinat cu , iv id = „23c57df361” sau () pentru a crea clasele menționate mai sus.

Exemplu fără literal:

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

Exemplu cu literalmente:

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

n special, sub manipularea manuală a numărului de referință de memorie, aceste obiecte sunt auto-biberate, ceea ce necesită îngrijire specială atunci când, de exemplu, sunt utilizate cu variabile de funcții statice sau alte tipuri de variabile globale.

SUBSCRIPTINGITAR

atunci când Apple LLVM 4.0 sau mai mare compilator, vectori și dicționare (clase NSArray și ) pot fi manipulate folosind utilizarea subscrieri. Subscripturile pot fi utilizate pentru a recupera valorile indexului (vectori) sau cheile (dicționarele) și obiectele mutabile pot fi de asemenea utilizate pentru a seta obiecte la indici sau taste. În cod, subscripturile sunt reprezentate folosind paranteze iv id = „7fac110b27” .

Exemple fără substructuri:

iv id = „540cdee031”

Exemple cu subscripturi:

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

OBIECTIV-C „MODERN” Sintaxă (1997) Editați

După achiziționarea de către Apple, au fost făcute mai multe încercări pentru a face limba mai mult în raport cu alte limbi existente. Una dintre aceste încercări a fost introducerea a ceea ce sa numit „sintaxa modernă” la momentul Obiectiv-C (spre deosebire de sintaxa existentă, „clasică”). Nu au existat schimbări în comportamentul real, a fost pur și simplu o sintaxă alternativă. Invocarea la o metodă a fost făcută în acest fel:

div>

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

și sa întâmplat în acest sens:

objeto = init];;

În mod similar, declarațiile:

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

a fi astfel:

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

Această sintaxă „modernă” nu este acceptată în dialectele curente curente.

obiect portabil compilreditar

în plus față de implementările GCC / următoare / Apple, care A adăugat mai multe extensii la implementarea inițială Stepstone, există, de asemenea, o altă implementare gratuită și deschisă a obiectivului-C numit compilator de obiecte protectice. Setul de extensii implementate de compilatorul de obiecte portabile diferă de implementările GCC / următoare / Apple; În special, include blocuri similare cu cele ale lui Smalltalk pentru Obiectiv-C, fără protocoale și categorii, două caracteristici utilizate pe scară largă în Openstep și derivații săi. Împreună, POC reprezintă o etapă veche, înainte, a evoluției limbii, pur și simplu conform Cartei din 1991 Brad Cox.

include, de asemenea, o bibliotecă de execuție numită ObjectPak, care se află în originalul ICPak101 Biblioteca de COX (care la rândul său derivă din biblioteca de clasă SmallTalk-80) și este radical diferită de Fundația Onestep.

GeOS Obiectiv-Cedditar

Sistemul de PC GEOS a folosit un limbaj de programare cunoscut sub numele de GEOS Obiectiv-C sau GOC; În ciuda denumirii sale similare, cele două limbi sunt similare într-un concept global și prin utilizarea cuvintelor cheie precedate de semnul @.

ClanGentator

suita compilatorului clang, parte din Proiectul LLVM, implementează obiectivul-C precum și alte limbi.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *