Objective-C: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Rimuovo dei wikilink errati.
 
(5 versioni intermedie di 4 utenti non mostrate)
Riga 83:
 
==== Portable Object Compiler ====
Oltre alle implementazioni [[GNU Compiler Collection|GCC]]/[[NeXT]]/[[Apple]], che hanno aggiunto diverse estensioni a quella originale di [[Stepstone]], esiste un'altra implementazione [[Open Source]] di Objective C che aggiunge un set di estensioni lievemente differente: il ''Portable Object Compiler''[http://users.pandora.be/stes/compiler.html] <ref>{{cita web | url=http://users.pandora.be/stes/compiler.html | titolo=Portable Object Compiler | lingua=en | urlarchivio=https://web.archive.org/web/20080802040731/http://users.pandora.be/stes/compiler.html | dataarchivio=2 agosto 2008 | urlmorto=sì }}</ref> implementa tra l'altro anche dei blocchi di codice sullo stile Smalltalk.
 
== Sintassi ==
Riga 147:
...
}
+ metodoDiClasse2
{
// implementazione
Riga 212:
Le rappresentazioni interne di questi metodi possono variare con le diverse implementazioni di Objective C.
 
Se ''MyColor''<code>myColor</code>, nell'esempio precedente, fosse della classe ''<code>Color''</code>, internamente il metodo d'istanza ''<code>-changeColorWithRed:green:blue:'' </code> potrebbe essere etichettato ''<code>_i_Color_changeColorWithRed_green_blue''</code>, dove ''<code>i''</code> seguito dal nome della classe, si riferisce al fatto che è un metodo d'istanza ed i due punti (:) sono sostituiti dal [[trattino basso]] (_). Dato che l'ordine dei parametri fa parte del nome del metodo, esso non può essere cambiato.
 
In ogni caso i nomi interni delle funzioni sono usati raramente in maniera diretta e generalmente anche i messaggi inviati sono convertiti in funzioni definite in librerie di [[run-time]] e non accedono direttamente ai nomi interni. Ciò è dovuto anche al fatto che al momento della [[compilazione]] non sempre si conosce quale metodo sarà effettivamente chiamato, perché la classe del destinatario (l'oggetto a cui viene inviato il messaggio) potrebbe essere sconosciuta fino al run-time.
Riga 241:
Objective C (come Smalltalk) può usare la [[tipo di dato|tipizzazione dinamica]]; ovvero rende possibile, per aumentare la flessibilità, inviare ad un oggetto un messaggio non definito nella propria interfaccia. In Objective C un oggetto può "catturare" questo messaggio e può inviarlo ad un altro oggetto (che può rispondere correttamente o inviare a sua volta il messaggio ad un altro oggetto e così via). Questo comportamento è chiamato ''forwarding'' (in [[lingua italiana|italiano]]: ''inoltro'') o ''delega'' del messaggio (si veda [[#Forwarding|sotto]]). In alternativa, è possibile usare un gestore degli errori nel caso il messaggio non possa essere inoltrato. Nel caso l'oggetto non inoltri il messaggio, non gestisca l'errore o non risponda sarà generato un errore a tempo di esecuzione.
 
Informazioni di tipizzazione statica possono essere aggiunte eventualmente alle variabili. Tali informazioni sono controllate nela [[compile-time]]. Nelle istruzioni seguenti, vengono fornite informazioni di tipo sempre più specifiche. Le istruzioni sono equivalenti durante l'esecuzione, ma le informazioni consentono al compilatore di avvisare il programmatore se gli argomenti passati non corrispondono ai tipi specificati. Nella prima istruzione, l'oggetto deve conformarsi al protocollo ''aProtocol'' e, nella seconda, deve essere un membro della classe ''NSNumber''.
<syntaxhighlight lang="objc">
- setMyValue:(id <aProtocol>) foo;
Riga 583:
L'implementazione dell'Objective C usa un semplice [[run-time system]] scritto in [[linguaggio C]] che aumenta di poco la dimensione delle applicazioni. Al contrario, la maggior parte dei sistemi object-oriented esistenti quando fu creato (e [[Java (linguaggio di programmazione)|Java]] tuttora) usava una grossa [[macchina virtuale]] invasiva per l'intero sistema. I programmi scritti in Objective C tendono ad essere di poco più grandi delle dimensioni del loro [[codice oggetto]] e delle [[libreria software|librerie]] usate (che generalmente non devono essere incluse nel codice distribuito), al contrario ad esempio dei sistemi [[Smalltalk]] dove grandi quantità di memoria sono necessarie semplicemente per aprire una [[finestra (informatica)|finestra]].
 
Il linguaggio può essere implementato con un compilatore C (in [[GNU Compiler Collection|GCC]], prima come un [[preprocessore]] ed in seguito come un modulo del compilatore) piuttosto che con un nuovo compilatore. Ciò consente all'Objective C di sfruttare l'enorme mole di codice, librerie e strumenti già esistenti in C che può essere adattata in Objective C per fornire un'interfaccia object-oriented. TutteTutti questi fattori riducono le barriere d'ingresso al nuovo linguaggio, fattore che costituì il problema principale di Smalltalk negli [[anni 1980|anni ottanta]].
 
Le prime versioni di Objective C non supportavano la [[garbage collection]]. Al tempo questa scelta fu oggetto di discussioni e in molti (ai tempi di Smalltalk) la consideravano un lungo "tempo morto" in cui il sistema era reso non più utilizzabile. Anche se qualche implementazione di terze parti (principalmente [[GNUstep]]) aveva già aggiunto questa caratteristica, è stata implementata da [[Apple]] una tecnica simile tramite [[Automatic Reference Counting|ARC]] in [[Mac OS X Leopard]], ma non è disponibile per applicazioni implementate per versioni precedenti del [[sistema operativo]].<ref>{{Cita web | url=https://www.apple.com/macosx/developertools/xcode.html | titolo=Mac OS X Leopard – Xcode 3.0 | autore=Apple, Inc. | anno=22 agosto 2006 | sito=apple.com | accesso=22 agosto 2006 | lingua=en | urlarchivio=https://web.archive.org/web/20071024144921/http://www.apple.com/macosx/developertools/xcode.html | dataarchivio=24 ottobre 2007 | urlmorto=sì }}</ref>
 
Un'altra critica comunemente fatta all'Objective C è quella di non avere un supporto nativo per i [[namespace]]. I programmatori sono perciò costretti ad aggiungere [[prefisso|prefissi]] in maniera più o meno arbitraria ai nomi delle classi che implementano, fatto che può causare collisioni. Dal [[2007]] tutte le classi e le funzioni di [[macOS]] in ambiente [[Cocoa (software)|Cocoa]] hanno il prefisso "NS" (es. ''NSObject'' o ''NSButton'') per identificarle chiaramente; "NS" deriva dal nome delle classi definite durante lo sviluppo di [[NeXTSTEP]].
 
Dato che Objective C è uno stretto [[superinsieme]] del C, non tratta i tipi primitivi del C come [[first-class object]].