<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wx="http://ilps.science.uva.nl/WikiXML/wx" xml:lang="it" lang="it">
<head>
<title>Objective C</title>
<meta name="wx_namespace" content="0"/>
<meta name="wx_pagename" content="Objective_C"/>
<meta name="wx_page_id" content="60399"/>
</head>
<body>
<div id="wx_article">
<wx:section level="1" title="Objective C" id="wxsec1"><h1 class="pagetitle" id="wx1">Objective C</h1>

<p id="wx2"><b id="wx3">Objective C</b>, spesso citato anche come <b id="wx4">Objective-C</b> o <b id="wx5">ObjC</b> o <b id="wx6">Obj-C</b>, è un <a href="/wit/Linguaggio_di_programmazione" title="Linguaggio di programmazione" wx:linktype="known" wx:pagename="Linguaggio_di_programmazione" wx:page_id="2573" id="wx7">linguaggio di programmazione</a> <a href="/wit/Riflessione_%28informatica%29" title="Riflessione (informatica)" wx:linktype="known" wx:pagename="Riflessione_(informatica)" wx:page_id="106059" id="wx8">riflessivo</a> <a href="/wit/Programmazione_orientata_agli_oggetti" title="Programmazione orientata agli oggetti" wx:linktype="known" wx:pagename="Programmazione_orientata_agli_oggetti" wx:page_id="23026" id="wx9">orientato agli oggetti</a>, sviluppato da <a href="/wit/Brad_Cox" title="Brad Cox" wx:linktype="known" wx:pagename="Brad_Cox" wx:page_id="262203" id="wx10">Brad Cox</a> alla metà degli <a href="/wit/Anni_1980" title="Anni 1980" wx:linktype="known" wx:pagename="Anni_1980" wx:page_id="40" id="wx11">anni '80</a> presso la <a href="/wit/Stepstone" title="Stepstone" wx:linktype="known" wx:pagename="Stepstone" wx:page_id="262201" id="wx12">Stepstone</a> Corporation.</p>

<p id="wx13">Come lo stesso nome suggerisce, l'Objective C è un'estensione a oggetti del <a href="/wit/Linguaggio_C" title="Linguaggio C" wx:linktype="known" wx:pagename="Linguaggio_C" wx:page_id="2556" id="wx14">linguaggio C</a>. Esso mantiene la <i id="wx15">completa</i> compatibilità col C (a differenza di quanto avviene, per esempio, nel caso del <a href="/wit/C%2B%2B" title="C++" wx:linktype="known" wx:pagename="C++" wx:page_id="26839" id="wx16">C++</a>). Tra l'altro, anche a causa di questa compatibilità, Objective C non è dotato di <a href="/wit/Forte_tipizzazione" title="Forte tipizzazione" wx:linktype="known" wx:pagename="Forte_tipizzazione" wx:page_id="236412" id="wx17">forte tipizzazione</a> (caratteristica che invece esibiscono, tra gli altri, sia C++ che <a href="/wit/Java_%28linguaggio%29" title="Java (linguaggio)" wx:linktype="known" wx:pagename="Java_(linguaggio)" wx:page_id="26747" id="wx18">Java</a>).</p>

<p id="wx19">Le estensioni a oggetti con cui Objective C arricchisce il modello semantico del C sono ispirate al linguaggio <a href="/wit/Smalltalk" title="Smalltalk" wx:linktype="known" wx:pagename="Smalltalk" wx:page_id="26850" id="wx20">Smalltalk</a>, in particolar modo alla <a href="/wit/Comunicazione_a_scambio_di_messaggi" title="Comunicazione a scambio di messaggi" wx:linktype="known" wx:pagename="Comunicazione_a_scambio_di_messaggi" wx:page_id="131834" id="wx21">gestione dei messaggi</a>. Le caratteristiche del <i id="wx22"><a href="/wit/Runtime_system" title="Runtime system" wx:linktype="known" wx:pagename="Runtime_system" wx:page_id="1589146" id="wx23">runtime system</a></i> collocano l'Objective C tra i linguaggi ad oggetti dinamici. Sono supportati tutti gli elementi classici della programmazione a oggetti; ma non mancano concetti innovativi anche su questo fronte, come il meccanismo delle <a href="#Categorie" title="" wx:linktype="fragment" wx:fragment="Categorie" id="wx24">categorie</a> e strumenti legati alla <a href="/wit/Riflessione_%28informatica%29" title="Riflessione (informatica)" wx:linktype="known" wx:pagename="Riflessione_(informatica)" wx:page_id="106059" id="wx25">riflessione</a>.</p>

<p id="wx26">La sua diffusione è principalmente legata al <a href="/wit/Framework" title="Framework" wx:linktype="known" wx:pagename="Framework" wx:page_id="466369" id="wx27">framework</a> <a href="/wit/OpenStep" title="OpenStep" wx:linktype="known" wx:pagename="OpenStep" wx:page_id="49966" id="wx28">OpenStep</a> di <a href="/wit/NeXT" title="NeXT" wx:linktype="known" wx:pagename="NeXT" wx:page_id="19710" id="wx29">NeXT</a> e al suo successore <a href="/wit/Cocoa" title="Cocoa" wx:linktype="known" wx:pagename="Cocoa" wx:page_id="49970" id="wx30">Cocoa</a>, presente nel sistema operativo <a href="/wit/Mac_OS_X" title="Mac OS X" wx:linktype="known" wx:pagename="Mac_OS_X" wx:page_id="19457" id="wx31">Mac OS X</a> di <a href="/wit/Apple" title="Apple" wx:linktype="known" wx:pagename="Apple" wx:page_id="12655" id="wx32">Apple</a>. A <a href="/wit/NeXT" title="NeXT" wx:linktype="known" wx:pagename="NeXT" wx:page_id="19710" id="wx33">NeXT</a> si deve il supporto dell'Objective C nel compilatore <a href="/wit/Gcc" title="Gcc" wx:linktype="known" wx:pagename="Gcc" wx:page_id="91679" id="wx34">gcc</a> di <a href="/wit/GNU" title="GNU" wx:linktype="known" wx:pagename="GNU" wx:page_id="2024" id="wx35">GNU</a>.</p>

<div id="wx_toc"/>

<a id="Storia" name="Storia"/>
<wx:section level="2" title="Storia" id="wxsec2"><h2 id="wx36">Storia</h2>

<a id="Le_origini" name="Le_origini"/>
<wx:section level="3" title="Le origini" id="wxsec12"><h3 id="wx37">Le origini</h3>

<p id="wx38">Nei primi anni '80, la pratica comune dell'<a href="/wit/Ingegneria_del_software" title="Ingegneria del software" wx:linktype="known" wx:pagename="Ingegneria_del_software" wx:page_id="64993" id="wx39">ingegneria del software</a> era basata sulla <a href="/wit/Programmazione_strutturata" title="Programmazione strutturata" wx:linktype="known" wx:pagename="Programmazione_strutturata" wx:page_id="26306" id="wx40">programmazione strutturata</a>. Questa modalità era stata sviluppata per poter suddividere programmi di grandi dimensioni in parti più piccole, principalmente per facilitare il lavoro di sviluppo e di manutenzione del software. Ciononostante, col crescere della dimensione dei problemi da risolvere, la programmazione strutturata divenne sempre meno utile, dato che conduceva alla stesura di un numero sempre maggiore di procedure, ad uno <i id="wx41"><a href="/wit/Spaghetti_code" title="Spaghetti code" wx:linktype="known" wx:pagename="Spaghetti_code" wx:page_id="81082" id="wx42">spaghetti code</a></i> e ad uno scarso riuso del <a href="/wit/Codice_sorgente" title="Codice sorgente" wx:linktype="known" wx:pagename="Codice_sorgente" wx:page_id="15812" id="wx43">codice sorgente</a>.</p>

<p id="wx44">Venne ipotizzato poi che la <a href="/wit/Programmazione_orientata_agli_oggetti" title="Programmazione orientata agli oggetti" wx:linktype="known" wx:pagename="Programmazione_orientata_agli_oggetti" wx:page_id="23026" id="wx45">programmazione orientata agli oggetti</a> potesse essere una potenziale soluzione al problema. In effetti <a href="/wit/Smalltalk" title="Smalltalk" wx:linktype="known" wx:pagename="Smalltalk" wx:page_id="26850" id="wx46">Smalltalk</a> aveva già affrontato molte di queste questioni ingegneristiche, pur con lo svantaggio di necessitare di una <a href="/wit/Macchina_virtuale" title="Macchina virtuale" wx:linktype="known" wx:pagename="Macchina_virtuale" wx:page_id="26702" id="wx47">macchina virtuale</a> che interpretava un <a href="/wit/Oggetto_%28informatica%29" title="Oggetto (informatica)" wx:linktype="known" wx:pagename="Oggetto_(informatica)" wx:page_id="16634" id="wx48">oggetto</a> in memoria chiamato immagine contenente tutti gli strumenti necessari. L'immagine Smalltalk era molto grossa, usava tendenzialmente un'enorme quantità di memoria per l'epoca e girava molto lentamente anche per la mancanza di un supporto specifico dell'<a href="/wit/Hardware" title="Hardware" wx:linktype="known" wx:pagename="Hardware" wx:page_id="2233" id="wx49">hardware</a> alle macchine virtuali.</p>

<p id="wx50">L'Objective C fu creato principalmente da <a href="/wit/Brad_Cox" title="Brad Cox" wx:linktype="known" wx:pagename="Brad_Cox" wx:page_id="262203" id="wx51">Brad Cox</a> e <a href="/wit/Tom_Love" class="new" title="Tom Love" wx:linktype="unknown" wx:pagename="Tom_Love" id="wx52">Tom Love</a> all'inizio degli anni '80 alla <a href="/wit/Stepstone" title="Stepstone" wx:linktype="known" wx:pagename="Stepstone" wx:page_id="262201" id="wx53">Stepstone</a>. Entrambi erano stati introdotti a Smalltalk durante la loro permanenza al Programming Technology Center della <a href="/wit/ITT_Corporation" class="new" title="ITT Corporation" wx:linktype="unknown" wx:pagename="ITT_Corporation" id="wx54">ITT Corporation</a> nel <a href="/wit/1981" title="1981" wx:linktype="known" wx:pagename="1981" wx:page_id="4704" id="wx55">1981</a>. Cox aveva iniziato ad interessarsi ai problemi legati alla riusabilità del software e si accorse che un linguaggio simile a Smalltalk sarebbe stato estremamente valido per costruire potenti <a href="/wit/Framework" title="Framework" wx:linktype="known" wx:pagename="Framework" wx:page_id="466369" id="wx56">ambiente di sviluppo</a> per i progettisti di ITT. Cox iniziò così a modificare il compilatore C per aggiungere alcune delle caratteristiche di Smalltalk. Ottenne così ben presto una implementazione funzionante di una estensione ad oggetti del linguaggio C che chiamò <i id="wx57">OOPC</i> (Object-Oriented Programming in C). Nel frattempo Love fu assunto da Schlumberger Research nel <a href="/wit/1982" title="1982" wx:linktype="known" wx:pagename="1982" wx:page_id="4703" id="wx58">1982</a> ed ebbe l'opportunità di acquisire la prima copia commerciale di Smalltalk-80 che influenzò in seguito lo sviluppo della loro creatura.</p>

<p id="wx59">Per dimostrare che il linguaggio costituiva un reale progresso, Cox mostrò che per realizzare componenti software intercambiabili erano necessari pochi adattamenti pratici agli strumenti già esistenti. Nello specifico, era necessario supportare gli oggetti in modo flessibile con un insieme di <a href="/wit/Libreria_software" title="Libreria software" wx:linktype="known" wx:pagename="Libreria_software" wx:page_id="41504" id="wx60">librerie software</a> che fossero usabili e consentissero al codice sorgente (e ad ogni risorsa necessaria al codice) di essere <i id="wx61">raccolto</i> in un solo formato <a href="/wit/Multipiattaforma" title="Multipiattaforma" wx:linktype="known" wx:pagename="Multipiattaforma" wx:page_id="160830" id="wx62">multipiattaforma</a>.</p>

<p id="wx63">Cox e Love formarono infine una nuova <a href="/wit/Impresa" title="Impresa" wx:linktype="known" wx:pagename="Impresa" wx:page_id="279862" id="wx64">impresa</a>, la Productivity Products International (PPI), per commercializzare il loro prodotto che accoppiava un compilatore Objective C con una potente classe di librerie.</p>

<p id="wx65">Nel <a href="/wit/1986" title="1986" wx:linktype="known" wx:pagename="1986" wx:page_id="4677" id="wx66">1986</a> Cox pubblicò la sua descrizione dell'Objective C nella sua forma originale nel libro <i id="wx67">Object-Oriented Programming, An Evolutionary Approach</i>. Sebbene fosse attento a puntualizzare che la questione della riusabilità del software non poteva essere esaurita dal <a href="/wit/Linguaggio_di_programmazione" title="Linguaggio di programmazione" wx:linktype="known" wx:pagename="Linguaggio_di_programmazione" wx:page_id="2573" id="wx68">linguaggio di programmazione</a>, l'Objective C si trovò spesso ad essere confrontato, caratteristica per caratteristica, con gli altri linguaggi</p>

<a id="NeXT" name="NeXT"/>
</wx:section><wx:section level="3" title="NeXT" id="wxsec13"><h3 id="wx69">NeXT</h3>

<p id="wx70">Nel <a href="/wit/1988" title="1988" wx:linktype="known" wx:pagename="1988" wx:page_id="4675" id="wx71">1988</a>, <a href="/wit/NeXT" title="NeXT" wx:linktype="known" wx:pagename="NeXT" wx:page_id="19710" id="wx72">NeXT</a>, la compagnia fondata da <a href="/wit/Steve_Jobs" title="Steve Jobs" wx:linktype="known" wx:pagename="Steve_Jobs" wx:page_id="19388" id="wx73">Steve Jobs</a> dopo <a href="/wit/Apple" title="Apple" wx:linktype="known" wx:pagename="Apple" wx:page_id="12655" id="wx74">Apple</a>, ottenne la licenza dell'Objective C da Stepstone (allora proprietaria del <a href="/wit/Marchio" title="Marchio" wx:linktype="known" wx:pagename="Marchio" wx:page_id="429421" id="wx75">marchio</a>) e realizzò il proprio compilatore Objective C e le librerie sulle quali basò l'<a href="/wit/Interfaccia_utente" title="Interfaccia utente" wx:linktype="known" wx:pagename="Interfaccia_utente" wx:page_id="57545" id="wx76">interfaccia utente</a> di <a href="/wit/NeXTSTEP" title="NeXTSTEP" wx:linktype="known" wx:pagename="NeXTSTEP" wx:page_id="49964" id="wx77">NeXTSTEP</a>. Sebbene le <a href="/wit/Workstation" title="Workstation" wx:linktype="known" wx:pagename="Workstation" wx:page_id="214613" id="wx78">workstation</a> NeXTSTEP non riuscirono ad avere un forte impatto sul mercato, i loro strumenti vennero ampliamente apprezzati dall'industria del settore. Ciò portò NeXTstep ad abbandonare la produzione di hardware ed a focalizzarsi sugli strumenti software, vendendo NeXTSTEP (e <a href="/wit/OpenStep" title="OpenStep" wx:linktype="known" wx:pagename="OpenStep" wx:page_id="49966" id="wx79">OpenStep</a>) come piattaforma per la programmazione.</p>

<p id="wx80">In seguito il <a href="/wit/GNU" title="GNU" wx:linktype="known" wx:pagename="GNU" wx:page_id="2024" id="wx81">progetto GNU</a> iniziò a lavorare sul clone gratuito che chiamò <a href="/wit/GNUstep" title="GNUstep" wx:linktype="known" wx:pagename="GNUstep" wx:page_id="114301" id="wx82">GNUstep</a>, basato sullo <a href="/wit/Standard" title="Standard" wx:linktype="known" wx:pagename="Standard" wx:page_id="110426" id="wx83">standard</a> OpenStep. <a href="/wit/Dennis_Glatting" class="new" title="Dennis Glatting" wx:linktype="unknown" wx:pagename="Dennis_Glatting" id="wx84">Dennis Glatting</a> scrisse il primo <a href="/wit/Run-time" title="Run-time" wx:linktype="known" wx:pagename="Run-time" wx:page_id="26836" id="wx85">run-time</a> gnu-objc nel <a href="/wit/1992" title="1992" wx:linktype="known" wx:pagename="1992" wx:page_id="4671" id="wx86">1992</a> e <a href="/wit/Richard_Stallman" title="Richard Stallman" wx:linktype="known" wx:pagename="Richard_Stallman" wx:page_id="3650" id="wx87">Richard Stallman</a> lo seguì subito dopo con un secondo. il run-time GNU Objective C, che è usato dal <a href="/wit/1993" title="1993" wx:linktype="known" wx:pagename="1993" wx:page_id="4670" id="wx88">1993</a>, è stato sviluppato da <a href="/wit/Kresten_Krab_Thorup" class="new" title="Kresten Krab Thorup" wx:linktype="unknown" wx:pagename="Kresten_Krab_Thorup" id="wx89">Kresten Krab Thorup</a> mentre era studente universitario in <a href="/wit/Danimarca" title="Danimarca" wx:linktype="known" wx:pagename="Danimarca" wx:page_id="126159" id="wx90">Danimarca</a>.</p>

<a id="Apple" name="Apple"/>
</wx:section><wx:section level="3" title="Apple" id="wxsec14"><h3 id="wx91">Apple</h3>

<p id="wx92">Dopo aver acquisito NeXT nel <a href="/wit/1996" title="1996" wx:linktype="known" wx:pagename="1996" wx:page_id="4667" id="wx93">1996</a>, Apple ha usato OpenStep come base per il suo nuovo <a href="/wit/Sistema_operativo" title="Sistema operativo" wx:linktype="known" wx:pagename="Sistema_operativo" wx:page_id="3917" id="wx94">sistema operativo</a> <a href="/wit/Mac_OS_X" title="Mac OS X" wx:linktype="known" wx:pagename="Mac_OS_X" wx:page_id="19457" id="wx95">Mac OS X</a>. Questo gli consentì di includere l'Objective C di NeXT ed il suo sistema di sviluppo <a href="/wit/Project_Builder" class="new" title="Project Builder" wx:linktype="unknown" wx:pagename="Project_Builder" id="wx96">Project Builder</a> (in seguito rinominato <a href="/wit/Xcode" title="Xcode" wx:linktype="known" wx:pagename="Xcode" wx:page_id="42195" id="wx97">Xcode</a>). La maggior parte delle attuali <a href="/wit/API" title="API" wx:linktype="known" wx:pagename="API" wx:page_id="122833" id="wx98">API</a> di Apple (<a href="/wit/Cocoa" title="Cocoa" wx:linktype="known" wx:pagename="Cocoa" wx:page_id="49970" id="wx99">API Cocoa</a>) sono basate sugli oggetti d'interfaccia di OpenStep e costituiscono il più significativo ambiente di sviluppo basato su Objective C attualmente usato.</p>

<a id="Sviluppi" name="Sviluppi"/>
</wx:section></wx:section><wx:section level="2" title="Sviluppi" id="wxsec3"><h2 id="wx100">Sviluppi</h2>

<a id="Oggi" name="Oggi"/>
<wx:section level="3" title="Oggi" id="wxsec15"><h3 id="wx101">Oggi</h3>

<p id="wx102">Oggi Objective C è spesso usato in tandem con librerie fisse di oggetti standard (spesso denominati "kit" o "<a href="/wit/Framework" title="Framework" wx:linktype="known" wx:pagename="Framework" wx:page_id="466369" id="wx103">framework</a>") come <a href="/wit/Cocoa" title="Cocoa" wx:linktype="known" wx:pagename="Cocoa" wx:page_id="49970" id="wx104">Cocoa</a> o <a href="/wit/GNUstep" title="GNUstep" wx:linktype="known" wx:pagename="GNUstep" wx:page_id="114301" id="wx105">GNUstep</a>. Queste librerie sono spesso fornite assieme al <a href="/wit/Sistema_operativo" title="Sistema operativo" wx:linktype="known" wx:pagename="Sistema_operativo" wx:page_id="3917" id="wx106">sistema operativo</a>: le librerie GNUstep sono parte della <a href="/wit/Distribuzione_Linux" title="Distribuzione Linux" wx:linktype="known" wx:pagename="Distribuzione_Linux" wx:page_id="282100" id="wx107">distribuzione Linux</a> e Cocoa di <a href="/wit/MacOS_X" title="MacOS X" wx:linktype="known" wx:pagename="MacOS_X" wx:page_id="27539" id="wx108">MacOS X</a>. Il programmatore non è obbligato ad ereditare le funzionalità della classe base esistente (NSObject). Objective C permette la dichiarazione di nuove classi base che non ereditino nessuna delle funzionalità preesistenti. Originariamente gli ambienti di programmazione basati su Objective C offrivano la classe Object con alcune funzionalità di base, ma con l'introduzione di <a href="/wit/OpenStep" title="OpenStep" wx:linktype="known" wx:pagename="OpenStep" wx:page_id="49966" id="wx109">OpenStep</a>, <a href="/wit/NeXT" title="NeXT" wx:linktype="known" wx:pagename="NeXT" wx:page_id="19710" id="wx110">NeXT</a> ha creato una nuova classe base chiamata NSObject che offriva caratteristiche aggiuntive oltre a quelle di Object. Quasi tutte le classi di Cocoa ereditano da NSObject.</p>

<p id="wx111">La rinominazione non è servita solo per differenziare i nuovi comportamenti delle classi nel nuovo framework, ma ha consentito al codice che ancora usava la classe Object di coesistere (sebbene con alcune limitazioni) nello stesso <a href="/wit/Run-time_system" title="Run-time system" wx:linktype="known" wx:pagename="Run-time_system" wx:page_id="1589145" id="wx112">run-time system</a>. Nello stesso tempo l'introduzione del prefisso di due lettere è diventato una sorta di surrogato alla mancanza in Objective C degli spacename. Usare un prefisso per creare in identificatore di package informale è diventata un'abitudine standard nella comunità di programmatori Objective C.</p>

<a id="Objective_C_2.0" name="Objective_C_2.0"/>
</wx:section><wx:section level="3" title="Objective C 2.0" id="wxsec16"><h3 id="wx113">Objective C 2.0</h3>

<p id="wx114">Alla <a href="/wit/Worldwide_Developers_Conference" title="Worldwide Developers Conference" wx:linktype="known" wx:pagename="Worldwide_Developers_Conference" wx:page_id="62668" id="wx115">Worldwide Developers Conference</a> del <a href="/wit/2006" title="2006" wx:linktype="known" wx:pagename="2006" wx:page_id="40247" id="wx116">2006</a>, <a href="/wit/Apple" title="Apple" wx:linktype="known" wx:pagename="Apple" wx:page_id="12655" id="wx117">Apple</a> ha annunciato l'uscita di "Objective C 2.0" i cui contenuti sono la <a href="/wit/Garbage_collection" title="Garbage collection" wx:linktype="known" wx:pagename="Garbage_collection" wx:page_id="115853" id="wx118">garbage collection</a>, migliorie nella sintassi<sup id="_ref-0" class="reference"><a href="#_note-0" title="" wx:fragment="_note-0" wx:linktype="note" id="wx119"/></sup>, miglioramenti delle prestazioni del run-time<sup id="_ref-1" class="reference"><a href="#_note-1" title="" wx:fragment="_note-1" wx:linktype="note" id="wx120"/></sup> e il supporto ai <a href="/wit/64-bit" title="64-bit" wx:linktype="known" wx:pagename="64-bit" wx:page_id="95548" id="wx121">64-bit</a><sup id="_ref-2" class="reference"><a href="#_note-2" title="" wx:fragment="_note-2" wx:linktype="note" id="wx122"/></sup>. Non è ancora noto quando queste evoluzioni saranno supportate nel run-time GNU, sebbene lo siano già in <a href="/wit/Mac_OS_X_10.5_Leopard" title="Mac OS X 10.5 Leopard" wx:linktype="known" wx:pagename="Mac_OS_X_10.5_Leopard" wx:page_id="109299" id="wx123">Mac OS X 10.5 Leopard</a><sup id="_ref-3" class="reference"><a href="#_note-3" title="" wx:fragment="_note-3" wx:linktype="note" id="wx124"/></sup>.</p>

<a id="Garbage_collection" name="Garbage_collection"/>
<wx:section level="4" title="Garbage collection" id="wxsec26"><h4 id="wx125">Garbage collection</h4>

<p id="wx126">Objective C 2.0 consente la garbage collection, ma in maniera dipendente dal sistema operativo. Tuttavia è possibile usarla in modo retro-compatibile, in modo che il codice sorgente scritto per versioni precedenti continui a funzionare.</p>

<a id="Propriet.C3.A0" name="Propriet.C3.A0"/>
</wx:section><wx:section level="4" title="Proprietà" id="wxsec27"><h4 id="wx127">Proprietà</h4>

<p id="wx128">Mentre precedentemente le variabili d'istanza richiedevano metodi espliciti di lettura e scrittura (detti <i id="wx129">getters</i> e <i id="wx130">setters</i>), Objective C 2.0 introduce le proprietà (<i id="wx131">property</i>) con la seguente sintassi: &lt;source lang="objc"&gt;</p>

<pre id="wx132">
@interface Persona : NSObject {
}
@property(readonly) NSString *nome;
@property(readonly) int eta;
-(id)initWithName:(NSString)nome eta:(int)eta;
@end
</pre>

<p id="wx133">&lt;/source&gt; Una volta inserite nell'interfaccia, le proprietà possono essere accedute usando la notazione descritta nell'esempio: &lt;source lang="objc"&gt;NSString *nome = unaPersona.nome;&lt;/source&gt; Il compilatore traduce questa notazione in chiamate di metodi accessori. L'istruzione precedente è equivalente a: &lt;source lang="objc"&gt;NSString *nome = [unaPersona nome];&lt;/source&gt;</p>

<a id="Enumerazione_veloce" name="Enumerazione_veloce"/>
</wx:section><wx:section level="4" title="Enumerazione veloce" id="wxsec28"><h4 id="wx134">Enumerazione veloce</h4>

<p id="wx135">Invece di usare un oggetto enumeratore per operare iterazioni all'interno di una raccolta di oggetti, Objective C 2.0 offre una sintassi di ciclo dedicata; riprendendo l'esempio precedente: &lt;source lang="objc"&gt; for (Persona *persona in laGente)</p>

<pre id="wx136">
 NSLog(@"%@ ha %i anni.", persona.nome, persona.eta);
</pre>

<p id="wx137">&lt;/source&gt;</p>

<a id="Portable_Object_Compiler" name="Portable_Object_Compiler"/>
</wx:section><wx:section level="4" title="Portable Object Compiler" id="wxsec29"><h4 id="wx138">Portable Object Compiler</h4>

<p id="wx139">Oltre alle implementazioni <a href="/wit/GNU_Compiler_Collection" title="GNU Compiler Collection" wx:linktype="known" wx:pagename="GNU_Compiler_Collection" wx:page_id="91623" id="wx140">GCC</a>/<a href="/wit/NeXT" title="NeXT" wx:linktype="known" wx:pagename="NeXT" wx:page_id="19710" id="wx141">NeXT</a>/<a href="/wit/Apple" title="Apple" wx:linktype="known" wx:pagename="Apple" wx:page_id="12655" id="wx142">Apple</a>, che hanno aggiunto diverse estensioni a quella originale di <a href="/wit/Stepstone" title="Stepstone" wx:linktype="known" wx:pagename="Stepstone" wx:page_id="262201" id="wx143">Stepstone</a>, esiste un'altra implementazione <a href="/wit/Open_Source" title="Open Source" wx:linktype="known" wx:pagename="Open_Source" wx:page_id="3115" id="wx144">Open Source</a> di Objective C che aggiunge un set di estensioni lievemente differente: il <i id="wx145">Portable Object Compiler</i><a href="http://users.pandora.be/stes/compiler.html" class="external autonumber" wx:linktype="external" rel="nofollow" id="wx146"/> implementa tra l'altro anche dei blocchi di codice sullo stile Smalltalk.</p>

<a id="Sintassi" name="Sintassi"/>
</wx:section></wx:section></wx:section><wx:section level="2" title="Sintassi" id="wxsec4"><h2 id="wx147">Sintassi</h2>

<p id="wx148">l'Objective C è un sottile strato posto <i id="wx149">sopra</i> il <a href="/wit/Linguaggio_C" title="Linguaggio C" wx:linktype="known" wx:pagename="Linguaggio_C" wx:page_id="2556" id="wx150">linguaggio C</a>; C quindi è uno <a href="/wit/Sottoinsieme" title="Sottoinsieme" wx:linktype="known" wx:pagename="Sottoinsieme" wx:page_id="4116" id="wx151">sottoinsieme</a> stretto dell'Objective C. Ne consegue che è possibile compilare un qualsiasi programma scritto in C con un compilatore Objective C. La gran parte della <a href="/wit/Sintassi" title="Sintassi" wx:linktype="known" wx:pagename="Sintassi" wx:page_id="96506" id="wx152">sintassi</a> (clausole del <a href="/wit/Preprocessore" title="Preprocessore" wx:linktype="known" wx:pagename="Preprocessore" wx:page_id="153041" id="wx153">preprocessore</a>, <a href="/wit/Espressione_%28informatica%29" title="Espressione (informatica)" wx:linktype="known" wx:pagename="Espressione_(informatica)" wx:page_id="259888" id="wx154">espressioni</a>, <a href="/wit/Funzione_%28informatica%29" title="Funzione (informatica)" wx:linktype="known" wx:pagename="Funzione_(informatica)" wx:page_id="66786" id="wx155">dichiarazioni e chiamate di funzioni</a>) è derivata da quella del C, mentre la sintassi relativa alle caratteristiche <a href="/wit/Object-oriented" title="Object-oriented" wx:linktype="known" wx:pagename="Object-oriented" wx:page_id="85381" id="wx156">object-oriented</a> è stata creata per ottenere la <a href="/wit/Comunicazione_a_scambio_di_messaggi" title="Comunicazione a scambio di messaggi" wx:linktype="known" wx:pagename="Comunicazione_a_scambio_di_messaggi" wx:page_id="131834" id="wx157">comunicazione a scambio di messaggi</a> simile a quella di <a href="/wit/Smalltalk" title="Smalltalk" wx:linktype="known" wx:pagename="Smalltalk" wx:page_id="26850" id="wx158">Smalltalk</a>.</p>

<a id="Messaggi" name="Messaggi"/>
<wx:section level="3" title="Messaggi" id="wxsec17"><h3 id="wx159">Messaggi</h3>

<p id="wx160">la sintassi aggiunta rispetto al C è intesa al supporto della programmazione ad oggetti. Il modello di programmazione dell'Objective C è basato sullo scambio di messaggi tra oggetti così come avviene in Smalltalk. Tale modello è differente da quello di <a href="/wit/Simula" title="Simula" wx:linktype="known" wx:pagename="Simula" wx:page_id="26745" id="wx161">Simula</a>, che viene usato in numerosi linguaggi quali, tra gli altri, il <a href="/wit/C%2B%2B" title="C++" wx:linktype="known" wx:pagename="C++" wx:page_id="26839" id="wx162">C++</a>. Questa distinzione è <a href="/wit/Semantica_%28informatica%29" class="new" title="Semantica (informatica)" wx:linktype="unknown" wx:pagename="Semantica_(informatica)" id="wx163">semanticamente</a> importante e consiste principalmente nel fatto che in Objective C non si <i id="wx164">chiama un <a href="/wit/Metodo_%28programmazione%29" title="Metodo (programmazione)" wx:linktype="known" wx:pagename="Metodo_(programmazione)" wx:page_id="233404" id="wx165">metodo</a></i>, ma si <i id="wx166">invia un <a href="/wit/Messaggio" title="Messaggio" wx:linktype="known" wx:pagename="Messaggio" wx:page_id="201565" id="wx167">messaggio</a></i>.</p>

<p id="wx168">Si dice che un oggetto chiamato <i id="wx169">ogg</i> la cui <a href="/wit/Classe_%28informatica%29" title="Classe (informatica)" wx:linktype="known" wx:pagename="Classe_(informatica)" wx:page_id="67016" id="wx170">classe</a> implementa il metodo <i id="wx171">faiQualcosa</i>, <i id="wx172">risponde</i> al messaggio <i id="wx173">faiQualcosa</i>. L'invio del messaggio <i id="wx174">faiQualcosa</i> all'oggetto <i id="wx175">ogg</i> è espresso da: &lt;source lang="objc"&gt;[ogg faiQualcosa];&lt;/source&gt;</p>

<p id="wx176">mentre l'azione equivalente in C++ sarebbe espressa da: &lt;source lang="cpp"&gt;ogg.faiQualcosa();&lt;/source&gt;</p>

<p id="wx177">In questo modo è possibile inviare messaggi ad un oggetto anche se l'oggetto <i id="wx178">non è capace</i> di rispondere. Questo differisce dai linguaggi <a href="/wit/Tipo_di_dato" title="Tipo di dato" wx:linktype="known" wx:pagename="Tipo_di_dato" wx:page_id="26742" id="wx179">tipizzati</a> staticamente come C++ e <a href="/wit/Java_%28linguaggio%29" title="Java (linguaggio)" wx:linktype="known" wx:pagename="Java_(linguaggio)" wx:page_id="26747" id="wx180">Java</a> nei quali tutte le chiamate devo essere di metodi predefiniti.</p>

<a id="Interfacce_e_implementazioni" name="Interfacce_e_implementazioni"/>
</wx:section><wx:section level="3" title="Interfacce e implementazioni" id="wxsec18"><h3 id="wx181">Interfacce e implementazioni</h3>

<p id="wx182">l'Objective C richiede che l'<a href="/wit/Interfaccia" title="Interfaccia" wx:linktype="known" wx:pagename="Interfaccia" wx:page_id="138198" id="wx183">interfaccia</a> e l'<a href="/wit/Implementazione" title="Implementazione" wx:linktype="known" wx:pagename="Implementazione" wx:page_id="834276" id="wx184">implementazione</a> di una classe siano dichiarati in blocchi di codice differenti. Per convenzione l'interfaccia è messa in un file con suffisso ".h", mentre l'implementazione in un file con suffisso ".m".</p>

<a id="Interfaccia" name="Interfaccia"/>
<wx:section level="4" title="Interfaccia" id="wxsec30"><h4 id="wx185">Interfaccia</h4>

<p id="wx186">L'interfaccia di una classe è solitamente definita in un file ".h". La convenzione usata è quella di assegnare il nome al file basandosi sul nome della classe, nell'esempio "NomeDellaClasse.h".</p>

<p id="wx187">&lt;source lang="objc"&gt;</p>

<pre id="wx188">
//definizione dell'interfaccia: "NomeDellaClasse.h"
</pre>

<pre id="wx189">
#import "NomeDellaSuperclasse.h"
</pre>

<pre id="wx190">
@interface NomeDellaClasse : NomeDellaSuperclasse
{
   //variabili d'istanza
   int variabileIntera;
   float variabileFloat;
   ...
}
//metodi di classe
+ metodoDiClasse1
+ metodoDiClasse2
+ ...
</pre>

<pre id="wx191">
//metodi di istanza
- metodoDiIstanza1
- metodoDiIstanza2
- ...
</pre>

<pre id="wx192">
@end
</pre>

<p id="wx193">&lt;/source&gt;</p>

<p id="wx194">Il segno meno (-) denota i metodi d'istanza, mentre il segno più (+) quello di classe (analoghi alle funzioni statiche del C++). Si noti la differenza di significato con le convenzioni dei <a href="/wit/Unified_Modeling_Language" title="Unified Modeling Language" wx:linktype="known" wx:pagename="Unified_Modeling_Language" wx:page_id="77450" id="wx195">diagrammi UML</a> dove i due segni rappresentano rispettivamente i metodi privati e pubblici.</p>

<a id="Implementazione" name="Implementazione"/>
</wx:section><wx:section level="4" title="Implementazione" id="wxsec31"><h4 id="wx196">Implementazione</h4>

<p id="wx197">L'interfaccia dichiara solamente i <a href="/wit/Prototipo" title="Prototipo" wx:linktype="known" wx:pagename="Prototipo" wx:page_id="11460" id="wx198">prototipi</a> dei metodi e non i metodi stessi che vengono inseriti nell'implementazione. L'implementazione è solitamente scritta in un file con estensione ".m". La convenzione usata è quella di assegnare il nome al file basandosi sul nome della classe, nell'esempio "NomeDellaClasse.m"</p>

<p id="wx199">&lt;source lang="objc"&gt;</p>

<pre id="wx200">
//definizione dell'implementazione: "NomeDellaClasse.m"
</pre>

<pre id="wx201">
#import "NomeDellaClasse.h"
</pre>

<pre id="wx202">
@implementation NomeDellaClasse
+ metodoDiClasse1
{
   // implementazione
   ...
}
 + metodoDiClasse2
{
   // implementazione
   ...
}
...
- metodoDiIstanza1
{
   // implementazione
   ...
}
- metodoDiIstanza2
{
   // implementazione
   ...
}
...
</pre>

<pre id="wx203">
@end
</pre>

<p id="wx204">&lt;/source&gt;</p>

<p id="wx205">I metodi sono scritti in maniera diversa dalle <a href="/wit/Funzione_%28informatica%29" title="Funzione (informatica)" wx:linktype="known" wx:pagename="Funzione_(informatica)" wx:page_id="66786" id="wx206">funzioni</a> in stile C. Ad esempio, una funzione, sia in C che in Objective C segue la seguente forma generale:</p>

<p id="wx207">&lt;source lang="objc"&gt;</p>

<pre id="wx208">
int fai_la_radice_quadrata(int i)
{
   return radice_quadrata(i);
}
</pre>

<p id="wx209">&lt;/source&gt;</p>

<p id="wx210">che avrà come prototipo:</p>

<p id="wx211">&lt;source lang="objc"&gt;int fai_la_radice_quadrata(int);&lt;/source&gt;</p>

<p id="wx212">L'implementazione come metodo diverrà:</p>

<p id="wx213">&lt;source lang="objc"&gt;</p>

<pre id="wx214">
- (int) fai_la_radice_quadrata:(int) i
{
   return [self radice_quadrata: i];
}
</pre>

<p id="wx215">&lt;/source&gt;</p>

<p id="wx216">Un approccio più canonico alla scrittura del metodo sarebbe quello di citare il primo argomento nel nome del selettore:</p>

<p id="wx217">&lt;source lang="objc"&gt;</p>

<pre id="wx218">
- (int) faiLaRadiceQuadrataDiInt: (int) i
{
   return [self radiceQuadrataDiInt:i];
}
</pre>

<p id="wx219">&lt;/source&gt;</p>

<p id="wx220">Questa sintassi può apparire complicata, ma consente di assegnare i nomi ai <a href="/wit/Parametro_%28informatica%29" title="Parametro (informatica)" wx:linktype="known" wx:pagename="Parametro_(informatica)" wx:page_id="235286" id="wx221">parametri</a>, ad esempio:</p>

<p id="wx222">&lt;source lang="objc"&gt;</p>

<pre id="wx223">
- (int) changeColorWithRed:(int) r  green:(int) g  blue:(int) b
</pre>

<p id="wx224">&lt;/source&gt;</p>

<p id="wx225">può essere invocato così: &lt;source lang="objc"&gt;</p>

<pre id="wx226">
[myColor changeColorWithRed:5 green:2 blue:6];
</pre>

<p id="wx227">&lt;/source&gt;</p>

<p id="wx228">Le rappresentazioni interne di questi metodi possono variare con le diverse implementazioni di Objective C.</p>

<p id="wx229">Se <i id="wx230">MyColor</i>, nell'esempio precedente, fosse della classe <i id="wx231">Color</i>, internamente il metodo d'istanza <i id="wx232">-changeColorWithRed:green:blue:</i> potrebbe essere etichettato <i id="wx233">_i_Color_changeColorWithRed_green_blue</i>, dove <i id="wx234">i</i> seguito dal nome della classe, si riferisce al fatto che è un metodo d'istanza ed i due punti (:) sono sostituiti dal <a href="/wit/Trattino_basso" title="Trattino basso" wx:linktype="known" wx:pagename="Trattino_basso" wx:page_id="1129188" id="wx235">trattino basso</a> (_). Dato che l'ordine dei parametri fa parte del nome del metodo, esso non può essere cambiato.</p>

<p id="wx236">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 <a href="/wit/Run-time" title="Run-time" wx:linktype="known" wx:pagename="Run-time" wx:page_id="26836" id="wx237">run-time</a> e non accedono direttamente ai nomi interni. Ciò è dovuto anche al fatto che al momento della <a href="/wit/Compilazione" title="Compilazione" wx:linktype="known" wx:pagename="Compilazione" wx:page_id="52942" id="wx238">compilazione</a> 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.</p>

<a id="Protocolli" name="Protocolli"/>
</wx:section></wx:section><wx:section level="3" title="Protocolli" id="wxsec19"><h3 id="wx239">Protocolli</h3>

<p id="wx240">Objective C è stato esteso da <a href="/wit/NeXT" title="NeXT" wx:linktype="known" wx:pagename="NeXT" wx:page_id="19710" id="wx241">NeXT</a> per introdurre il concetto di <a href="/wit/Ereditariet%C3%A0_multipla_%28informatica%29" title="Ereditarietà multipla (informatica)" wx:linktype="known" wx:pagename="Ereditarietà_multipla_(informatica)" wx:page_id="223292" id="wx242">ereditarietà multipla</a> di specifica, ma non di implementazione, attraverso l'uso dei protocolli. Questo è un <a href="/wit/Design_pattern" title="Design pattern" wx:linktype="known" wx:pagename="Design_pattern" wx:page_id="40962" id="wx243">pattern</a> ottenibile sia mediante una forma di ereditarietà multipla da una <a href="/wit/Classe_astratta" title="Classe astratta" wx:linktype="known" wx:pagename="Classe_astratta" wx:page_id="222820" id="wx244">classe astratta</a> (come in in C++), sia (come più comunemente in Java o <a href="/wit/C" title="C" wx:linktype="known" wx:pagename="C" wx:page_id="23319" id="wx245">C#</a>) mediante l'uso di un'<a href="/wit/Interfaccia_%28informatica%29" title="Interfaccia (informatica)" wx:linktype="known" wx:pagename="Interfaccia_(informatica)" wx:page_id="105059" id="wx246">interfaccia</a>. Objective C fa uso di entrambi i protocolli, chiamati <i id="wx247">protocolli informali</i> e di protocolli imposti dal compilatore detti <i id="wx248">protocolli formali.</i></p>

<p id="wx249">Un protocollo informale è una lista di <a href="/wit/Metodo_%28informatica%29" title="Metodo (informatica)" wx:linktype="known" wx:pagename="Metodo_(informatica)" wx:page_id="235285" id="wx250">metodi</a> che una classe può implementare. Viene specificato nella documentazione, dato che non è presente esplicitamente nel linguaggio. I protocolli informali spesso includono metodi opzionali, dove l'implementazione del metodo può cambiare il comportamento della classe. Ad esempio una classe con un <a href="/wit/Campo_%28informatica%29" title="Campo (informatica)" wx:linktype="known" wx:pagename="Campo_(informatica)" wx:page_id="600419" id="wx251">campo</a> di testo potrebbe avere un "delegato" che dovrebbe implementare un protocollo informale con un metodo opzionale di <a href="/wit/Autocompletamento" title="Autocompletamento" wx:linktype="known" wx:pagename="Autocompletamento" wx:page_id="720164" id="wx252">autocompletamento</a>. Il campo di testo scopre se il delegato implementa o meno il metodo (attraverso il meccanismo della <a href="/wit/Riflessione_%28informatica%29" title="Riflessione (informatica)" wx:linktype="known" wx:pagename="Riflessione_(informatica)" wx:page_id="106059" id="wx253">riflessione</a>), e, in caso positivo, lo chiama per supportare l'autocompletamento.</p>

<p id="wx254">Un protocollo formale è simile ad un'interfaccia Java o C#. Esso consiste di una lista di metodi che ogni classe può dichiarare di implementare. Il compilatore segnalerà un errore se la classe non implementa ogni metodo dei protocolli che dichiara. Il concetto Objective C di protocolli differisce da quello di interfacce di Java e C# nel fatto che una classe può implementare un protocollo senza dichiararlo esplicitamente. La differenza non è individuabile all'esterno del codice. I protocolli formali non possono fornire nessuna implementazione, essi assicurano semplicemente i chiamanti che le classi che sono conformi al protocollo forniranno le implementazioni. Nelle <a href="/wit/Libreria_software" title="Libreria software" wx:linktype="known" wx:pagename="Libreria_software" wx:page_id="41504" id="wx255">librerie</a> <a href="/wit/NeXT" title="NeXT" wx:linktype="known" wx:pagename="NeXT" wx:page_id="19710" id="wx256">NeXT</a>/<a href="/wit/Apple" title="Apple" wx:linktype="known" wx:pagename="Apple" wx:page_id="12655" id="wx257">Apple</a>, i protocolli sono usati di frequente dal sistema ad oggetti distribuiti per rappresentare le capacità di un oggetto eseguito su di un sistema remoto.</p>

<p id="wx258">La sintassi</p>

<pre id="wx259">
&lt;source lang="objc"&gt;
@protocol Locking
- (void)lock;
- (void)unlock;
@end
</pre>

<p id="wx260">&lt;/source&gt; indica che esiste un'idea astratta di <a href="/wit/Lock" title="Lock" wx:linktype="known" wx:pagename="Lock" wx:page_id="274949" id="wx261">locking</a> che può essere usata; quando è dichiarata in una definizione di classe &lt;source lang="objc"&gt;</p>

<pre id="wx262">
@interface NomeClasse : NomeSuperClasse &lt;Locking&gt;
@end
</pre>

<p id="wx263">&lt;/source&gt; indica che le istanze di <i id="wx264">NomeClasse</i> forniranno un'implementazione per i due metodi d'istanza come meglio crederanno. Questa specifica astratta è particolarmente utile per descrivere il comportamento desiderato ad esempio di <a href="/wit/Plugin" title="Plugin" wx:linktype="known" wx:pagename="Plugin" wx:page_id="132839" id="wx265">plugin</a> senza porre nessuna limitazione su quella che dovrà essere la gerarchia d'implementazione.</p>

<a id="Tipizzazione_dinamica" name="Tipizzazione_dinamica"/>
</wx:section><wx:section level="3" title="Tipizzazione dinamica" id="wxsec20"><h3 id="wx266">Tipizzazione dinamica</h3>

<p id="wx267">Objective C (come Smalltalk) può usare la <a href="/wit/Tipo_di_dato" title="Tipo di dato" wx:linktype="known" wx:pagename="Tipo_di_dato" wx:page_id="26742" id="wx268">tipizzazione dinamica</a>; ovvero rende possibile, per aumentare la flessibilità, inviare ad un oggetto un messaggio non specificato 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 <i id="wx269">forwarding</i> (in <a href="/wit/Lingua_italiana" title="Lingua italiana" wx:linktype="known" wx:pagename="Lingua_italiana" wx:page_id="650225" id="wx270">italiano</a>: <i id="wx271">inoltro</i>) o <i id="wx272">delega</i> del messaggio (si veda <a href="#Forwarding" title="" wx:linktype="fragment" wx:fragment="Forwarding" id="wx273">sotto</a>). In alternativa, è possibile usare un gestore degli errori nel caso il messaggio non possa essere inoltrato. Se l'oggetto non inoltra il messaggio, non gestisce l'errore o non risponde viene generato un errore di <a href="/wit/Run-time" title="Run-time" wx:linktype="known" wx:pagename="Run-time" wx:page_id="26836" id="wx274">run-time</a>.</p>

<p id="wx275">Informazioni di tipizzazione statica possono essere aggiunte eventualmente alle variabili. Tali informazioni sono controllate nel <a href="/wit/Compile-time" title="Compile-time" wx:linktype="known" wx:pagename="Compile-time" wx:page_id="450864" id="wx276">compile-time</a>. 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 <i id="wx277">aProtocol</i> e, nella seconda, deve essere un membro della classe <i id="wx278">NSNumber</i>. &lt;source lang="objc"&gt; - setMyValue:(id &lt;aProtocol&gt;) foo; - setMyValue:(NSNumber*)foo; &lt;/source&gt; La tipizzazione dinamica può essere una caratteristica molto potente. Se si implementano <a href="/wit/Classe_container" title="Classe container" wx:linktype="known" wx:pagename="Classe_container" wx:page_id="704503" id="wx279">classi container</a> usando linguaggi a tipizzazione statica come Java (prima della versione 1.5), il programmatore è costretto a scrivere classi container per oggetti generici e poi usare la <a href="/wit/Conversione_di_tipo" title="Conversione di tipo" wx:linktype="known" wx:pagename="Conversione_di_tipo" wx:page_id="582194" id="wx280">conversione di tipo</a> per adattarli ad oggetti specifici; tale conversione, comunque, contraddice la disciplina semantica della tipizzazione statica.</p>

<a id="Forwarding" name="Forwarding"/>
</wx:section><wx:section level="3" title="Forwarding" id="wxsec21"><h3 id="wx281">Forwarding</h3>

<p id="wx282">Dato che Objective C permette l'invio di un messaggio ad un oggetto che potrebbe non rispondere ad esso, l'oggetto può gestire tale messaggio in altri modi. Uno di questi potrebbe consistere nel suo <i id="wx283">inoltro</i> (in <a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx284">inglese</a>: <i id="wx285">forwarding</i>) ad un altro oggetto che sia in grado di rispondere. Il forwarding può essere usato per implementare semplicemente alcuni <a href="/wit/Design_pattern" title="Design pattern" wx:linktype="known" wx:pagename="Design_pattern" wx:page_id="40962" id="wx286">design pattern</a> quali l'<a href="/wit/Observer_pattern" title="Observer pattern" wx:linktype="known" wx:pagename="Observer_pattern" wx:page_id="841260" id="wx287">Observer pattern</a> o il <a href="/wit/Proxy_pattern" title="Proxy pattern" wx:linktype="known" wx:pagename="Proxy_pattern" wx:page_id="1819090" id="wx288">Proxy pattern</a>.</p>

<p id="wx289">Il <a href="/wit/Run-time_system" title="Run-time system" wx:linktype="known" wx:pagename="Run-time_system" wx:page_id="1589145" id="wx290">run-time system</a> di Objective C specifica una coppia di metodi della classe <tt id="wx291">Object</tt></p>

<ul id="wx292">
<li id="wx293">
<p id="wx294">metodi di forwarding:</p>
</li>
</ul>

<p id="wx295">&lt;source lang="objc"&gt; - (retval_t) forward:(SEL) sel :(arglist_t) args; // con GCC - (id) forward:(SEL) sel :(marg_list) args; // con sistemi NeXT/Apple &lt;/source&gt;</p>

<ul id="wx296">
<li id="wx297">
<p id="wx298">metodi di azione:</p>
</li>
</ul>

<p id="wx299">&lt;source lang="objc"&gt; - (retval_t) performv:(SEL) sel :(arglist_t) args; // con GCC - (id) performv:(SEL) sel :(marg_list) args; // con sistemi NeXT/Apple &lt;/source&gt; e se un oggetto vuole implementare il forwarding necessita solamente di "<a href="/wit/Override" title="Override" wx:linktype="known" wx:pagename="Override" wx:page_id="702783" id="wx300">sovrascrivere</a>" i metodi di forwarding per definire il proprio comportamento. I metodi di azione <tt id="wx301">performv::</tt> non necessitano override.</p>

<a id="Esempio" name="Esempio"/>
<wx:section level="4" title="Esempio" id="wxsec32"><h4 id="wx302">Esempio</h4>

<p id="wx303">Ecco un esempio di programma che illustra i fondamenti del forwarding.</p>

<dl id="wx304">
<dt id="wx305"><i id="wx306">Forwarder.h</i></dt>
</dl>

<p id="wx307">&lt;source lang="objc"&gt;</p>

<pre id="wx308">
#import &lt;objc/Object.h&gt;

@interface Forwarder : Object
{
   id recipient; //L'oggetto a cui vogliamo inoltrare il messaggio 
}

//Metodi accessori
- (id) recipient;
- (void) setRecipient:(id) _recipient; 

@end
</pre>

<p id="wx309">&lt;/source&gt;</p>

<dl id="wx310">
<dt id="wx311"><i id="wx312">Forwarder.m</i></dt>
</dl>

<p id="wx313">&lt;source lang="objc"&gt;</p>

<pre id="wx314">
#import "Forwarder.h"

@implementation Forwarder

- forward: (SEL) sel : (marg_list) args
{
   /*
    * Controlla se il destinatario risponde effettivamente al messaggio.
    * Ciò potrebbe o meno essere desiderabile, ad esempio, se un destinatario
    * non risponde al messaggio, potrebbe inoltrare egli stesso il messaggio.
    */
   if([recipient respondsTo:sel]) 
      return [recipient performv: sel : args];
   else
      return [self error:"Il destinatario non risponde"];
}

- (id) setRecipient: (id) _recipient
{
   recipient = _recipient;
   return self;
}

- (id) recipient
{
   return recipient;
}
@end
</pre>

<p id="wx315">&lt;/source&gt;</p>

<dl id="wx316">
<dt id="wx317"><i id="wx318">Recipient.h</i></dt>
</dl>

<p id="wx319">&lt;source lang="objc"&gt;</p>

<pre id="wx320">
#import &lt;objc/Object.h&gt;

// Un semplice oggetto destinatario.
@interface Recipient : Object
- (id) hello;
@end
</pre>

<p id="wx321">&lt;/source&gt;</p>

<dl id="wx322">
<dt id="wx323"><i id="wx324">Recipient.m</i></dt>
</dl>

<p id="wx325">&lt;source lang="objc"&gt;</p>

<pre id="wx326">
#import "Recipient.h"

@implementation Recipient

- (id) hello
{
   printf("Il destinatario ti saluta!\n");

   return self;
}

@end
</pre>

<p id="wx327">&lt;/source&gt;</p>

<dl id="wx328">
<dt id="wx329">main.m</dt>
</dl>

<p id="wx330">&lt;source lang="objc"&gt;</p>

<pre id="wx331">
#import "Forwarder.h"
#import "Recipient.h"

int
main(void)
{
   Forwarder *forwarder = [Forwarder new];
   Recipient *recipient = [Recipient new];

   [forwarder setRecipient:recipient]; //Setta il destinatario 
   /* 
    * Si noti che il "forwarder" non risponde al messaggio!
    * Esso sarà inoltrato. Tutti i metodi non riconosciuti saranno
    * inoltrati al destinatario (se il destinatario li gestisce,
    * come detto in "Forwarder").
    */
   [forwarder hello]; 

   return 0;
}
</pre>

<p id="wx332">&lt;/source&gt;</p>

<a id="Note" name="Note"/>
</wx:section><wx:section level="4" title="Note" id="wxsec33"><h4 id="wx333">Note</h4>

<p id="wx334">Se dovessimo compilare l'esempio, il compilatore segnalerebbe</p>

<pre id="wx335">
$ gcc -x objective-c -Wno-import Forwarder.m Recipient.m main.m -lobjc
main.m: In function `main':
main.m:12: warning: `Forwarder' does not respond to `hello'
$
</pre>

<p id="wx336">Il compilatore segnala ciò che è stato spiegato prima, che <tt id="wx337">Forwarder</tt> non risponde al messaggio. In certi casi, questa segnalazione può aiutare a trovare degli errori, ma in questo caso può essere ignorata dato che è stato implementato il forwarding. Per eseguire il programma basterà:</p>

<pre id="wx338">
$ ./a.out
Recipient says hello!
</pre>

<a id="Categorie" name="Categorie"/>
</wx:section></wx:section><wx:section level="3" title="Categorie" id="wxsec22"><h3 id="wx339">Categorie</h3>

<p id="wx340">L'esperienza del mondo della <a href="/wit/Programmazione_strutturata" title="Programmazione strutturata" wx:linktype="known" wx:pagename="Programmazione_strutturata" wx:page_id="26306" id="wx341">programmazione strutturata</a> aveva dimostrato che uno dei modi per migliorare la struttura del <a href="/wit/Codice_sorgente" title="Codice sorgente" wx:linktype="known" wx:pagename="Codice_sorgente" wx:page_id="15812" id="wx342">codice sorgente</a> è quello di suddividerlo in parti più piccole. Per migliorare questo processo Objective C ha introdotto il concetto di <i id="wx343">categoria</i>.</p>

<p id="wx344">Una categoria raccoglie implementazioni di metodi in file separati. Il programmatore può mettere dei gruppi di metodi correlati in una categoria per renderli più leggibili. Ad esempio, è possibile creare una categoria <i id="wx345">ControlloOrtografico</i> "su" un <a href="/wit/Oggetto_%28informatica%29" title="Oggetto (informatica)" wx:linktype="known" wx:pagename="Oggetto_(informatica)" wx:page_id="16634" id="wx346">oggetto</a> di tipo <a href="/wit/Stringa_%28informatica%29" title="Stringa (informatica)" wx:linktype="known" wx:pagename="Stringa_(informatica)" wx:page_id="79960" id="wx347">stringa</a> per raccogliere in un unico punto tutti i metodi relativi al controllo ortografico.</p>

<p id="wx348">Inoltre, i metodi inseriti in una categoria, sono aggiunti alla <a href="/wit/Classe_%28informatica%29" title="Classe (informatica)" wx:linktype="known" wx:pagename="Classe_(informatica)" wx:page_id="67016" id="wx349">classe</a> al <a href="/wit/Run-time" title="Run-time" wx:linktype="known" wx:pagename="Run-time" wx:page_id="26836" id="wx350">run-time</a>. In questo modo le categorie consentono al programmatore di aggiungere metodi ad una classe esistente senza bisogno di ricompilarla o addirittura senza nemmeno avere accesso al suo sorgente. Nell'esempio, se il sistema a disposizione non fornisce il supporto del controllo ortografico nell'implementazione della classe Stringa, è possibile aggiungerlo senza modificarne il sorgente.</p>

<p id="wx351">I metodi inseriti nelle categorie, diventano indistinguibili da quelli originari della classe quando il programma è in esecuzione. Una categoria ha pieno accesso a tutte le variabili d'istanza della classe, incluse quelle private.</p>

<p id="wx352">Le categorie forniscono una soluzione ai problemi legati alla "fragilità di base delle classi" per ciò che concerne i metodi.</p>

<p id="wx353">Se si dichiara un metodo in una categoria con la stessa <a href="/wit/Firma_%28programmazione%29" title="Firma (programmazione)" wx:linktype="known" wx:pagename="Firma_(programmazione)" wx:page_id="109033" id="wx354">firma</a> di un metodo già esistente in una classe, viene adottato il metodo della categoria. In questo modo le categorie, non solo possono aggiungere metodi alle classi, ma possono anche sostituire metodi già esistenti. Questa caratteristica può essere usata per correggere errori in altre classi, semplicemente riscrivendone i metodi, o per cambiare il comportamento di una classe in un dato programma. Se due categorie hanno metodi con la stessa firma, non è definito quale metodo andrà effettivamente in esecuzione.</p>

<p id="wx355">Diversi linguaggi hanno tentato di aggiungere questa caratteristica in vari modi. Il <a href="/wit/Linguaggio_TOM" class="new" title="Linguaggio TOM" wx:linktype="unknown" wx:pagename="Linguaggio_TOM" id="wx356">linguaggio TOM</a> ha portato ulteriormente avanti il concetto consentendo anche di aggiungere variabili. Altri linguaggi, come ad esempio il <a href="/wit/Self" class="new" title="Self" wx:linktype="unknown" wx:pagename="Self" id="wx357">Self</a>, hanno adottato invece soluzioni orientate ai <a href="/wit/Prototipo_%28programmazione%29" class="new" title="Prototipo (programmazione)" wx:linktype="unknown" wx:pagename="Prototipo_(programmazione)" id="wx358">prototipi</a>,</p>

<a id="Esempio_2" name="Esempio_2"/>
<wx:section level="4" title="Esempio" id="wxsec34"><h4 id="wx359">Esempio</h4>

<p id="wx360">Questo esempio costruisce una classe <tt id="wx361">Integer</tt>, definendo prima una classe base con solo pochi metodi implementati e aggiungendo in seguito due categorie, <tt id="wx362">Arithmetic</tt> e <tt id="wx363">Display</tt>, che estendono la classe base. Anche se queste categorie possono accedere alle variabili private della classe base, è buona norma accedere a tali variabili attraverso metodi di servizio che aiutano a tenere le categorie il più indipendenti possibili dalle classi che estendono. Questo è un tipico caso di uso delle categorie per aggiungere o modificare certi metodi della classe base (anche se non è considerata una buona abitudine quella di usare le categorie per sovrascrivere le sottoclassi).</p>

<dl id="wx364">
<dt id="wx365"><i id="wx366">Integer.h</i></dt>
</dl>

<p id="wx367">&lt;source lang="objc"&gt;</p>

<ol id="wx368">
<li id="wx369">
<p id="wx370">include &lt;objc/Object.h&gt;</p>
</li>
</ol>

<p id="wx371">@interface Integer : Object {</p>

<pre id="wx372">
  int integer;
</pre>

<p id="wx373">}</p>

<p id="wx374">- (int) integer; - (id) integer: (int) _integer; @end &lt;/source&gt;</p>

<dl id="wx375">
<dt id="wx376"><i id="wx377">Integer.m</i></dt>
</dl>

<p id="wx378">&lt;source lang="objc"&gt;</p>

<ol id="wx379">
<li id="wx380">
<p id="wx381">import "Integer.h"</p>
</li>
</ol>

<p id="wx382">@implementation Integer - (int) integer {</p>

<pre id="wx383">
  return integer;
</pre>

<p id="wx384">}</p>

<p id="wx385">- (id) integer: (int) _integer {</p>

<pre id="wx386">
  integer = _integer;
</pre>

<p id="wx387">} @end &lt;/source&gt;</p>

<dl id="wx388">
<dt id="wx389"><i id="wx390">Arithmetic.h</i></dt>
</dl>

<p id="wx391">&lt;source lang="objc"&gt;</p>

<ol id="wx392">
<li id="wx393">
<p id="wx394">import "Integer.h"</p>
</li>
</ol>

<p id="wx395">@interface Integer (Arithmetic) - (id) add: (Integer *) addend; - (id) sub: (Integer *) subtrahend; @end &lt;/source&gt;</p>

<dl id="wx396">
<dt id="wx397"><i id="wx398">Arithmetic.m</i></dt>
</dl>

<p id="wx399">&lt;source lang="objc"&gt;</p>

<ol id="wx400">
<li id="wx401">
<p id="wx402">import "Arithmetic.h"</p>
</li>
</ol>

<p id="wx403">@implementation Integer (Arithmetic) - (id) add: (Integer *) addend {</p>

<pre id="wx404">
  return [self integer: [self integer] + [addend integer]];
</pre>

<p id="wx405">}</p>

<p id="wx406">- (id) sub: (Integer *) subtrahend {</p>

<pre id="wx407">
  return [self integer: [self integer] - [subtrahend integer]];
</pre>

<p id="wx408">} @end &lt;/source&gt;</p>

<dl id="wx409">
<dt id="wx410"><i id="wx411">Display.h</i></dt>
</dl>

<p id="wx412">&lt;source lang="objc"&gt;</p>

<ol id="wx413">
<li id="wx414">
<p id="wx415">import "Integer.h"</p>
</li>
</ol>

<p id="wx416">@interface Integer (Display) - (id) showstars; - (id) showint; @end &lt;/source&gt;</p>

<dl id="wx417">
<dt id="wx418"><i id="wx419">Display.m</i></dt>
</dl>

<p id="wx420">&lt;source lang="objc"&gt;</p>

<ol id="wx421">
<li id="wx422">
<p id="wx423">import "Display.h"</p>
</li>
</ol>

<p id="wx424">@implementation Integer (Display) - (id) showstars {</p>

<pre id="wx425">
  int i, x = [self integer];
  for(i=0; i &lt; x; i++)
     printf("*");
  printf("\n");
</pre>

<pre id="wx426">
  return self;
</pre>

<p id="wx427">}</p>

<p id="wx428">- (id) showint {</p>

<pre id="wx429">
  printf("%d\n", [self integer]);
</pre>

<pre id="wx430">
  return self;
</pre>

<p id="wx431">} @end &lt;/source&gt;</p>

<dl id="wx432">
<dt id="wx433"><i id="wx434">main.m</i></dt>
</dl>

<p id="wx435">&lt;source lang="objc"&gt;</p>

<ol id="wx436">
<li id="wx437">
<p id="wx438">import "Integer.h"</p>
</li>

<li id="wx439">
<p id="wx440">import "Arithmetic.h"</p>
</li>

<li id="wx441">
<p id="wx442">import "Display.h"</p>
</li>
</ol>

<p id="wx443">int main(void) {</p>

<pre id="wx444">
  Integer *num1 = [Integer new], *num2 = [Integer new];
  int x;
  printf("Enter an integer: ");
  scanf("%d", &amp;x);
  [num1 integer:x];
  [num1 showstars];
  printf("Enter an integer: ");
  scanf("%d", &amp;x);
  [num2 integer:x];
  [num2 showstars];
</pre>

<pre id="wx445">
  [num1 add:num2];
  [num1 showint];
</pre>

<p id="wx446">} &lt;/source&gt;</p>

<a id="Note_2" name="Note_2"/>
</wx:section><wx:section level="4" title="Note" id="wxsec35"><h4 id="wx447">Note</h4>

<p id="wx448">la compilazione si effettua così:</p>

<pre id="wx449">
gcc -x objective-c main.m Integer.m Arithmetic.m Display.m -lobjc
</pre>

<p id="wx450">SI può provare ad omettere le linee <tt id="wx451">#import "Arithmetic.h"</tt> e <tt id="wx452">[num1 add:num2]</tt> e ad omettere <tt id="wx453">Arithmetic.m</tt> in compilazione. Il programma girerà lo stesso. Ciò significa che è possibile aggiungere o togliere categorie, dato che se non si ha bisogno di una certa funzionalità offerta da una categoria, basta semplicemente escluderla dalla compilazione.</p>

<a id="Posing" name="Posing"/>
</wx:section></wx:section><wx:section level="3" title="Posing" id="wxsec23"><h3 id="wx454">Posing</h3>

<p id="wx455">Objective C permette ad una classe di sostituirne completamente un'altra; questo meccanismo è detto <i id="wx456">posing</i> (dall'<a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx457">inglese</a> <i id="wx458">pose as</i>: fingersi per qualcun'altro). La classe sostituita è chiamata <i id="wx459">classe target</i> e la classe che sostituisce è chiamata <i id="wx460">classe posing</i>. Tutti i messaggi inviati alla classe target vengono ricevuti in sua vece dalla classe posing. Esistono numerose restrizioni da rispettare per effettuare il posing:</p>

<ul id="wx461">
<li id="wx462">
<p id="wx463">Una classe può solo sostituirsi a una delle sue <a href="/wit/Superclasse" title="Superclasse" wx:linktype="known" wx:pagename="Superclasse" wx:page_id="509461" id="wx464">superclassi</a> dirette o indirette.</p>
</li>

<li id="wx465">
<p id="wx466">La classe posing non deve definire nessuna nuova variabile d'istanza che sia assente dalla classe target (anche se può definire o overridare metodi).</p>
</li>

<li id="wx467">
<p id="wx468">Nessun messaggio deve essere inviato alla classe target prima del posing</p>
</li>
</ul>

<p id="wx469">Il posing, similmente alle categorie, consente un aumento globale delle classi esistenti e permette due possibilità assenti nelle categorie:</p>

<ul id="wx470">
<li id="wx471">
<p id="wx472">Una classe posing può chiamare metodi overridati attraverso <i id="wx473">super</i>, incorporando così l'implementazione della classe target.</p>
</li>

<li id="wx474">
<p id="wx475">Una classe posing può overridare i metodi definiti nelle categorie.</p>
</li>
</ul>

<p id="wx476">Ad esempio: &lt;source lang="objc"&gt;</p>

<pre id="wx477">
@interface CustomNSApplication : NSApplication
@end

@implementation CustomNSApplication
- (void) setMainMenu: (NSMenu*) menu
{
    // fa qualcosa col menu
}
@end

class_poseAs ([CustomNSApplication class], [NSApplication class]);
</pre>

<p id="wx478">&lt;/source&gt;</p>

<p id="wx479">Questo intercetta ogni invocazione a setMainMenu di NSApplication.</p>

<p id="wx480">Il posing è stato dichiarato deprecato con <a href="/wit/Mac_OS_X_10.5_Leopard" title="Mac OS X 10.5 Leopard" wx:linktype="known" wx:pagename="Mac_OS_X_10.5_Leopard" wx:page_id="109299" id="wx481">Mac OS X 10.5 Leopard</a> e non è disponibile nei run-time a 64 bit.</p>

<a id="_.23import" name=".23import"/>
</wx:section><wx:section level="3" title="#import" id="wxsec24"><h3 id="wx482">#import</h3>

<p id="wx483">In C, la direttiva del <a href="/wit/Precompilatore" title="Precompilatore" wx:linktype="known" wx:pagename="Precompilatore" wx:page_id="1054296" id="wx484">precompilatore</a> <i id="wx485">#include</i> consente di inserire un intero <a href="/wit/File" title="File" wx:linktype="known" wx:pagename="File" wx:page_id="14505" id="wx486">file</a> prima dell'inizio effettivo della <a href="/wit/Compilazione" title="Compilazione" wx:linktype="known" wx:pagename="Compilazione" wx:page_id="52942" id="wx487">compilazione</a>. Objective-C aggiunge a questa la direttiva <i id="wx488">#import</i>, che oltre a svolgere lo stesso ruolo della precedente, evita di includere il file qualora sia già stato incluso in precedenza.</p>

<p id="wx489">Ad esempio, il file A include i file X e Y, ma X e Y includono ciascuno il file Q, in questo caso Q verrebbe incluso due volte nel file risultante causando così delle definizioni duplicate e quindi un errore in compilazione. Se il file Q venisse incluso con la direttiva <i id="wx490">#import</i>, solo la prima inclusione verrebbe effettivamente effettuata e tutte le successive verrebbero ignorate.</p>

<p id="wx491">Alcuni compilatori, compreso <a href="/wit/GNU_Compiler_Collection" title="GNU Compiler Collection" wx:linktype="known" wx:pagename="GNU_Compiler_Collection" wx:page_id="91623" id="wx492">GCC</a>, supportano la clausola <i id="wx493">#import</i> anche per il linguaggio C; il suo uso viene comunque scoraggiato sulla base del fatto che l'utilizzatore dei file da includere dovrebbe distinguere quali file includere solo una volta da quelli progettati per essere inclusi più volte. Questo onere dovrebbe in teoria essere a carico dell'implementatore del file da includere che può usare la direttiva <i id="wx494">#pragma once</i> o usare la tradizionale tecnica:</p>

<pre id="wx495">
<code id="wx496">#ifndef HEADER_H
#define HEADER_H
... contents of header.h ...
#endif
</code>
</pre>

<p id="wx497">In questo caso le direttive <i id="wx498">#include</i> e <i id="wx499">#import</i> diventano equivalenti.</p>

<a id="Altre_caratteristiche" name="Altre_caratteristiche"/>
</wx:section></wx:section><wx:section level="2" title="Altre caratteristiche" id="wxsec5"><h2 id="wx500">Altre caratteristiche</h2>

<p id="wx501">Objective C ha incluso sin dal suo apparire un lista di caratteristiche che sono tuttora in via di acquisizione in altri linguaggi, oltre ad alcune che sono rimaste sue uniche prerogative. Ciò ha permesso di mettere in luce, partendo dalla realizzazione di Cox (ed in seguito da quella di <a href="/wit/NeXT" title="NeXT" wx:linktype="known" wx:pagename="NeXT" wx:page_id="19710" id="wx502">NeXT</a>), che alcuni considerazioni superano i concetti più strettamente legati al linguaggio. Il sistema deve essere usabile e flessibile nel complesso per poter essere pienamente fruibile.</p>

<ul id="wx503">
<li id="wx504">
<p id="wx505">Delegare i metodi ad altri oggetti al <a href="/wit/Run-time" title="Run-time" wx:linktype="known" wx:pagename="Run-time" wx:page_id="26836" id="wx506">run-time</a> è banale. Basta semplicemente aggiungere una categoria comprendente le modifiche ad un metodo per implementare il forwarding al destinatario della delega.</p>
</li>

<li id="wx507">
<p id="wx508">La <a href="/wit/Chiamata_di_procedura_remota" title="Chiamata di procedura remota" wx:linktype="known" wx:pagename="Chiamata_di_procedura_remota" wx:page_id="115616" id="wx509">chiamata di procedura remota</a> è banale. Basta semplicemente aggiungere una categoria con un metodo che "serializzi" l'invocazione e la inoltri.</p>
</li>

<li id="wx510">
<p id="wx511">Lo <a href="/wit/Swizzling" class="new" title="Swizzling" wx:linktype="unknown" wx:pagename="Swizzling" id="wx512">swizzling</a> dei <a href="/wit/Puntatore_%28informatica%29" title="Puntatore (informatica)" wx:linktype="known" wx:pagename="Puntatore_(informatica)" wx:page_id="838398" id="wx513">puntatori</a> consente di modificare le classi al run-time. Tipicamente per scopi di <a href="/wit/Debugging" title="Debugging" wx:linktype="known" wx:pagename="Debugging" wx:page_id="1656" id="wx514">debugging</a> se un oggetto la cui memoria è stata rilasciata dovesse venire referenziato per errore.</p>
</li>

<li id="wx515">
<p id="wx516">Un oggetto può essere archiviato su uno <a href="/wit/Stream" title="Stream" wx:linktype="known" wx:pagename="Stream" wx:page_id="287042" id="wx517">stream</a> (ad esempio un <a href="/wit/File" title="File" wx:linktype="known" wx:pagename="File" wx:page_id="14505" id="wx518">file</a>) e può essere riletto e recuperato su richiesta.</p>
</li>
</ul>

<a id="Objective_C.2B.2B" name="Objective_C.2B.2B"/>
</wx:section><wx:section level="2" title="Objective C++" id="wxsec6"><h2 id="wx519">Objective C++</h2>

<p id="wx520">Objective C++ è un <a href="/wit/Front-end" title="Front-end" wx:linktype="known" wx:pagename="Front-end" wx:page_id="235001" id="wx521">front-end</a> del compilatore <a href="/wit/GNU_Compiler_Collection" title="GNU Compiler Collection" wx:linktype="known" wx:pagename="GNU_Compiler_Collection" wx:page_id="91623" id="wx522">gcc</a> in grado di compilare <a href="/wit/Codice_sorgente" title="Codice sorgente" wx:linktype="known" wx:pagename="Codice_sorgente" wx:page_id="15812" id="wx523">codice sorgente</a> che usa una sintassi combinazione di C++ e Objective C. Objective C++ aggiunge a C++ le stesse estensioni che Objective C aggiunge a C. Dato che nulla è stato fatto per unificare le differenze semantiche tra i due linguaggi, sono state applicate alcune restrizioni:</p>

<ul id="wx524">
<li id="wx525">
<p id="wx526">una classe C++ non può derivare da una classe Objective C e viceversa</p>
</li>

<li id="wx527">
<p id="wx528">i <a href="/wit/Namespace" title="Namespace" wx:linktype="known" wx:pagename="Namespace" wx:page_id="3103" id="wx529">namespace</a> C++ non possono essere dichiarati all'interno di una dichiarazione Objective C</p>
</li>

<li id="wx530">
<p id="wx531">le classi Objective C non possono contenere variabili di istanza di classi C++ che non abbiano un <a href="/wit/Costruttore" class="new" title="Costruttore" wx:linktype="unknown" wx:pagename="Costruttore" id="wx532">costruttore</a> di <a href="/wit/Default" title="Default" wx:linktype="known" wx:pagename="Default" wx:page_id="1458955" id="wx533">default</a> o che abbiano uno o più <a href="/wit/Metodo_virtuale" class="new" title="Metodo virtuale" wx:linktype="unknown" wx:pagename="Metodo_virtuale" id="wx534">metodi virtuali</a>, ma si possono usare <a href="/wit/Puntatore" title="Puntatore" wx:linktype="known" wx:pagename="Puntatore" wx:page_id="26709" id="wx535">puntatori</a> ad oggetti C++ come variabili di istanza senza restrizioni</p>
</li>

<li id="wx536">
<p id="wx537">la semantica "per valore" del C++ non può essere applicata agli oggetti Objective C, i quali rimangono accessbili solo mediante puntatori</p>
</li>

<li id="wx538">
<p id="wx539">non ci possono essere dichiarazioni Objective C in dichiarazioni di <a href="/wit/Template" title="Template" wx:linktype="known" wx:pagename="Template" wx:page_id="601259" id="wx540">template</a> C++ e viceversa. Comunque è possibile usare tipi Objective C (es. Nomeclasse *) come parametri di template C++</p>
</li>

<li id="wx541">
<p id="wx542">La gestione delle eccezioni Objective C è distinta da quella di C++</p>
</li>
</ul>

<a id="Analisi_del_linguaggio" name="Analisi_del_linguaggio"/>
</wx:section><wx:section level="2" title="Analisi del linguaggio" id="wxsec7"><h2 id="wx543">Analisi del linguaggio</h2>

<p id="wx544">L'implementazione dell'Objective C usa un semplice <a href="/wit/Run-time_system" title="Run-time system" wx:linktype="known" wx:pagename="Run-time_system" wx:page_id="1589145" id="wx545">run-time system</a> scritto in <a href="/wit/Linguaggio_C" title="Linguaggio C" wx:linktype="known" wx:pagename="Linguaggio_C" wx:page_id="2556" id="wx546">linguaggio C</a> che aumenta di poco la dimensione delle applicazioni. Al contrario, la maggior parte dei sistemi object-oriented esistenti quando fu creato (e <a href="/wit/Java_%28linguaggio%29" title="Java (linguaggio)" wx:linktype="known" wx:pagename="Java_(linguaggio)" wx:page_id="26747" id="wx547">Java</a> tuttora) usava una grossa <a href="/wit/Macchina_virtuale" title="Macchina virtuale" wx:linktype="known" wx:pagename="Macchina_virtuale" wx:page_id="26702" id="wx548">macchina virtuale</a> invasiva per l'intero sistema. I programmi scritti in Objective C tendono a non essere troppo più grandi delle dimensioni del loro <a href="/wit/Codice_oggetto" title="Codice oggetto" wx:linktype="known" wx:pagename="Codice_oggetto" wx:page_id="87957" id="wx549">codice oggetto</a> e delle <a href="/wit/Libreria_software" title="Libreria software" wx:linktype="known" wx:pagename="Libreria_software" wx:page_id="41504" id="wx550">librerie</a> usate (che generalmente non devono essere incluse nel codice distribuito), al contrario ad esempio dei sistemi <a href="/wit/Smalltalk" title="Smalltalk" wx:linktype="known" wx:pagename="Smalltalk" wx:page_id="26850" id="wx551">Smalltalk</a> dove grandi quantità di memoria sono necessarie semplicemente per aprire una <a href="/wit/Finestra_%28informatica%29" title="Finestra (informatica)" wx:linktype="known" wx:pagename="Finestra_(informatica)" wx:page_id="890231" id="wx552">finestra</a>.</p>

<p id="wx553">Il linguaggio può essere implementato con un compilatore C (in <a href="/wit/GNU_Compiler_Collection" title="GNU Compiler Collection" wx:linktype="known" wx:pagename="GNU_Compiler_Collection" wx:page_id="91623" id="wx554">GCC</a>, prima come un <a href="/wit/Preprocessore" title="Preprocessore" wx:linktype="known" wx:pagename="Preprocessore" wx:page_id="153041" id="wx555">preprocessore</a> 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. Tutte questi fattori riducono le barriere d'ingresso al nuovo linguaggio, fattore che costituì il problema principale di Smalltalk negli anni '80.</p>

<p id="wx556">Le prime versioni di Objective C non supportavano la <a href="/wit/Garbage_collection" title="Garbage collection" wx:linktype="known" wx:pagename="Garbage_collection" wx:page_id="115853" id="wx557">garbage collection</a>. 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 inusabile. Anche se qualche implementazione di terze parti (principalmente <a href="/wit/GNUstep" title="GNUstep" wx:linktype="known" wx:pagename="GNUstep" wx:page_id="114301" id="wx558">GNUstep</a>) aveva già aggiunto questa caratteristica, questa è stata implementata da <a href="/wit/Apple" title="Apple" wx:linktype="known" wx:pagename="Apple" wx:page_id="12655" id="wx559">Apple</a> in <a href="/wit/Mac_OS_X_10.5" title="Mac OS X 10.5" wx:linktype="known" wx:pagename="Mac_OS_X_10.5" wx:page_id="113623" id="wx560">Mac OS X 10.5</a>, ma non è disponibile per applicazioni implementate per versioni precedenti del <a href="/wit/Sistema_operativo" title="Sistema operativo" wx:linktype="known" wx:pagename="Sistema_operativo" wx:page_id="3917" id="wx561">sistema operativo</a>.<sup id="_ref-4" class="reference"><a href="#_note-4" title="" wx:fragment="_note-4" wx:linktype="note" id="wx562"/></sup></p>

<p id="wx563">Un'altra critica comunemente fatta all'Objective C è quella di non avere un supporto nativo per i <a href="/wit/Namespace" title="Namespace" wx:linktype="known" wx:pagename="Namespace" wx:page_id="3103" id="wx564">namespace</a>. I programmatori sono perciò costretti ad aggiungere <a href="/wit/Prefisso" title="Prefisso" wx:linktype="known" wx:pagename="Prefisso" wx:page_id="369001" id="wx565">prefissi</a> in maniera più o meno arbitraria ai nomi delle classi che implementano, fatto che può causare collisioni. Dal <a href="/wit/2007" title="2007" wx:linktype="known" wx:pagename="2007" wx:page_id="1221032" id="wx566">2007</a> tutte le classi e le funzioni di <a href="/wit/Mac_OS_X" title="Mac OS X" wx:linktype="known" wx:pagename="Mac_OS_X" wx:page_id="19457" id="wx567">Mac OS X</a> in ambiente <a href="/wit/Cocoa" title="Cocoa" wx:linktype="known" wx:pagename="Cocoa" wx:page_id="49970" id="wx568">Cocoa</a> hanno il prefisso "NS" (es. <i id="wx569">NSObject</i> o <i id="wx570">NSButton</i>) per identificarle chiaramente; "NS" deriva dal nome delle classi definite durante lo sviluppo di <a href="/wit/NeXTSTEP" title="NeXTSTEP" wx:linktype="known" wx:pagename="NeXTSTEP" wx:page_id="49964" id="wx571">NeXTSTEP</a>.</p>

<p id="wx572">Dato che Objective C è uno stretto <a href="/wit/Superinsieme" class="new" title="Superinsieme" wx:linktype="unknown" wx:pagename="Superinsieme" id="wx573">superinsieme</a> del C, non tratta i tipi primitivi del C come <a href="/wit/First-class_object" class="new" title="First-class object" wx:linktype="unknown" wx:pagename="First-class_object" id="wx574">first-class object</a>.</p>

<p id="wx575">A differenza del C++, Objective C non supporta l'<a href="/wit/Overloading" title="Overloading" wx:linktype="known" wx:pagename="Overloading" wx:page_id="152693" id="wx576">overloading</a> degli operatori, consente l'<a href="/wit/Ereditariet%C3%A0_%28informatica%29" title="Ereditarietà (informatica)" wx:linktype="known" wx:pagename="Ereditarietà_(informatica)" wx:page_id="208249" id="wx577">ereditarietà</a> solo diretta da una singola classe (vietando così l'<a href="/wit/Ereditariet%C3%A0_multipla_%28informatica%29" title="Ereditarietà multipla (informatica)" wx:linktype="known" wx:pagename="Ereditarietà_multipla_(informatica)" wx:page_id="223292" id="wx578">ereditarietà multipla</a>). Dato che il <a href="/wit/Linguaggio_Java" title="Linguaggio Java" wx:linktype="known" wx:pagename="Linguaggio_Java" wx:page_id="231050" id="wx579">linguaggio Java</a> venne influenzato dall'Objective C, la decisione di usare l'ereditarietà singola venne portata anche in Java. In alternativa all'ereditarietà multipla possono essere usate le <a href="#Categorie" title="" wx:linktype="fragment" wx:fragment="Categorie" id="wx580">categorie</a> ed i <a href="#Protocolli" title="" wx:linktype="fragment" wx:fragment="Protocolli" id="wx581">protocolli</a>.</p>

<a id="Differenze_filosofiche_tra_Objective_C_e_C.2B.2B" name="Differenze_filosofiche_tra_Objective_C_e_C.2B.2B"/>
<wx:section level="3" title="Differenze filosofiche tra Objective C e C++" id="wxsec25"><h3 id="wx582">Differenze filosofiche tra Objective C e C++</h3>

<p id="wx583">Il progetto e l'implementazione del <a href="/wit/C%2B%2B" title="C++" wx:linktype="known" wx:pagename="C++" wx:page_id="26839" id="wx584">C++</a> e dell'Objective C rappresentano due diversi approcci all'estensione del C.</p>

<p id="wx585">Oltre alla <a href="/wit/Programmazione_strutturata" title="Programmazione strutturata" wx:linktype="known" wx:pagename="Programmazione_strutturata" wx:page_id="26306" id="wx586">programmazione strutturata</a> del C, C++ supporta direttamente la <a href="/wit/Programmazione_ad_oggetti" title="Programmazione ad oggetti" wx:linktype="known" wx:pagename="Programmazione_ad_oggetti" wx:page_id="307523" id="wx587">programmazione ad oggetti</a>, la programmazione generica e la <a href="/wit/Metaprogrammazione" class="new" title="Metaprogrammazione" wx:linktype="unknown" wx:pagename="Metaprogrammazione" id="wx588">metaprogrammazione</a>. C++ è inoltre corredato di una estesa libreria standard che include numerose <a href="/wit/Oggetto_container_%28informatica%29" title="Oggetto container (informatica)" wx:linktype="known" wx:pagename="Oggetto_container_(informatica)" wx:page_id="704497" id="wx589">classi container</a>. L'Objective C, invece, aggiunge solo delle caratteristiche <a href="/wit/Object-oriented" title="Object-oriented" wx:linktype="known" wx:pagename="Object-oriented" wx:page_id="85381" id="wx590">object-oriented</a> al C; esso, nella sua versione più "pura" non offre lo stesso numero di in termini di librerie standard, ma in molti contesti dove viene usato, viene corredato di una libreria sul modello di quella di <a href="/wit/OpenStep" title="OpenStep" wx:linktype="known" wx:pagename="OpenStep" wx:page_id="49966" id="wx591">OpenStep</a>, di <a href="/wit/Cocoa" title="Cocoa" wx:linktype="known" wx:pagename="Cocoa" wx:page_id="49970" id="wx592">Cocoa</a> o di <a href="/wit/GNUstep" title="GNUstep" wx:linktype="known" wx:pagename="GNUstep" wx:page_id="114301" id="wx593">GNUstep</a> le quali forniscono funzionalità simili a quelle offerte dalla libreria standard di C++.</p>

<p id="wx594">Un'altra notevole differenza consiste nel fatto che l'Objective C fornisce un maggior supporto run-time alla <a href="/wit/Riflessione_%28informatica%29" title="Riflessione (informatica)" wx:linktype="known" wx:pagename="Riflessione_(informatica)" wx:page_id="106059" id="wx595">riflessione</a> rispetto a C++. In Objective C si può interrogare un oggetto riguarde alle sue stesse proprietà, ad esempio se possa o meno rispondere ad un dato messaggio, mentre in C++ ciò è impossibile a meno di fare ricorso a librerie esterne. Comunque è possibile chiedere se due oggetti sono o meno dello stesso tipo (inclusi i tipi predefiniti) e se un oggetto è istanza di una data <a href="/wit/Classe_%28informatica%29" title="Classe (informatica)" wx:linktype="known" wx:pagename="Classe_(informatica)" wx:page_id="67016" id="wx596">classe</a> (o <a href="/wit/Superclasse_%28informatica%29" title="Superclasse (informatica)" wx:linktype="known" wx:pagename="Superclasse_(informatica)" wx:page_id="508292" id="wx597">superclasse</a>).</p>

<p id="wx598">L'uso della riflessione fa parte di una più ampia distinzione tra caratteristiche dinamiche (<a href="/wit/Run-time" title="Run-time" wx:linktype="known" wx:pagename="Run-time" wx:page_id="26836" id="wx599">run-time</a>) e statiche (<a href="/wit/Compile-time" title="Compile-time" wx:linktype="known" wx:pagename="Compile-time" wx:page_id="450864" id="wx600">compile-time</a>) dei linguaggi. Sebbene sia Objective C che C++ implementino un misto di entrambe le caratteristiche, Objective C è decisamente più orientato verso le decisioni dinamiche, mentre C++ verso quelle effettuate al momento della compilazione.</p>

<a id="Note_3" name="Note_3"/>
</wx:section></wx:section><wx:section level="2" title="Note" id="wxsec8"><h2 id="wx601">Note</h2>

<wx:template id="wx_t1" pagename="Template:References" page_id="673323"/>
<div class="references-small" id="wx602">
<ol class="references" id="wx603">
<li id="_note-0"><a href="#_ref-0" title="" wx:fragment="_ref-0" wx:linktype="noteref" id="wx604"><b id="wx605">^</b></a> <a href="http://lists.apple.com/archives/Objc-language/2006/Aug/msg00039.html" class="external text" wx:linktype="external" rel="nofollow" id="wx606">documento Apple</a></li>

<li id="_note-1"><a href="#_ref-1" title="" wx:fragment="_ref-1" wx:linktype="noteref" id="wx607"><b id="wx608">^</b></a> <a href="http://lists.apple.com/archives/Objc-language/2006/Aug/msg00018.html" class="external text" wx:linktype="external" rel="nofollow" id="wx609">documento Apple</a></li>

<li id="_note-2"><a href="#_ref-2" title="" wx:fragment="_ref-2" wx:linktype="noteref" id="wx610"><b id="wx611">^</b></a> <a href="http://developer.apple.com/leopard/overview/tools.html" class="external text" wx:linktype="external" rel="nofollow" id="wx612">documento Apple</a></li>

<li id="_note-3"><a href="#_ref-3" title="" wx:fragment="_ref-3" wx:linktype="noteref" id="wx613"><b id="wx614">^</b></a> <a href="http://www.apple.com/macosx/features/300.html#xcode3" class="external text" wx:linktype="external" rel="nofollow" id="wx615">documento Apple</a></li>

<li id="_note-4"><a href="#_ref-4" title="" wx:fragment="_ref-4" wx:linktype="noteref" id="wx616"><b id="wx617">^</b></a> <cite id="CITEREF" style="font-style:normal;">Apple, Inc.. <a href="http://www.apple.com/macosx/developertools/xcode.html" class="external text" wx:linktype="external" rel="nofollow" id="wx618">Mac OS X Leopard – Xcode 3.0</a>.   <a href="/wit/22_agosto" title="22 agosto" wx:linktype="known" wx:pagename="22_agosto" wx:page_id="5195" id="wx619">22 agosto</a> <a href="/wit/2006" title="2006" wx:linktype="known" wx:pagename="2006" wx:page_id="40247" id="wx620">2006</a>.<small id="wx621"> URL consultato il 2006-08-22</small>.</cite></li>
</ol>
</div>

<wx:templateend start="wx_t1"/>
<a id="Bibliografia" name="Bibliografia"/>
</wx:section><wx:section level="2" title="Bibliografia" id="wxsec9"><h2 id="wx622">Bibliografia</h2>

<ul id="wx623">
<li id="wx624"><i id="wx625">Object Oriented Programming: An Evolutionary Approach</i>
<p id="wx626">, Brad J. Cox - Addison Wesley (1991)</p>
</li>
</ul>

<a id="Altri_progetti" name="Altri_progetti"/>
</wx:section><wx:section level="2" title="Altri progetti" id="wxsec10"><h2 id="wx627">Altri progetti</h2>

<wx:template id="wx_t2" pagename="Template:Interprogetto" page_id="501098"/>
<div id="interProject" style="display:none; clear: both; border-top: 2px dotted #AAAAAA; margin-top: 2em;">
<div title="Collegamenti verso gli altri progetti Wikimedia" id="wx628">
<ul id="wx629">
<li id="wx630"><a href="http://it.wikibooks.org/wiki/Objective-C" class="extiw" title="b:Objective-C" wx:linktype="interwiki" wx:pagename="b:Objective-C" id="wx631">Wikibooks</a></li>
</ul>
</div>
</div>

<ul class="noindent" id="wx632">
<li id="wx633"><a href="/wit/Immagine:Wikibooks-logo.svg" title="Collabora a Wikibooks" wx:linktype="image" wx:pagename="Immagine:Wikibooks-logo.svg" id="wx634"><img src="/wit/Immagine:Wikibooks-logo.svg" alt="Collabora a Wikibooks" width="22" id="wx635"/></a> <b id="wx636"><a href="http://it.wikibooks.org/wiki/it:Pagina_principale" class="extiw" title="b:it:Pagina_principale" wx:linktype="interwiki" wx:pagename="b:it:Pagina_principale" id="wx637">Wikibooks</a></b>
<p id="wx638">contiene testi o manuali su <b id="wx639"><a href="http://it.wikibooks.org/wiki/Objective-C" class="extiw" title="b:Objective-C" wx:linktype="interwiki" wx:pagename="b:Objective-C" id="wx640">Objective C</a></b></p>
</li>
</ul>

<wx:templateend start="wx_t2"/>
<a id="Collegamenti_esterni" name="Collegamenti_esterni"/>
</wx:section><wx:section level="2" title="Collegamenti esterni" id="wxsec11"><h2 id="wx641">Collegamenti esterni</h2>

<ul id="wx642">
<li id="wx643"><wx:template id="wx_t3" pagename="Template:It" page_id="148383"/>
<p id="wx644">(<span style="font-weight:bolder;font-size:80%" id="wx645"><a href="/wit/Lingua_italiana" title="Lingua italiana" wx:linktype="known" wx:pagename="Lingua_italiana" wx:page_id="650225" id="wx646">IT</a></span>)<wx:templateend start="wx_t3"/> <a href="http://www.xcodeitalia.com" class="external text" wx:linktype="external" rel="nofollow" id="wx647">Xcodeitalia</a></p>
</li>

<li id="wx648"><wx:template id="wx_t4" pagename="Template:En" page_id="121878"/>
<p id="wx649">(<span style="font-weight:bolder; font-size:80%" id="wx650"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx651">EN</a></span>) <wx:templateend start="wx_t4"/> <a href="http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/" class="external text" wx:linktype="external" rel="nofollow" id="wx652">Introduction to The Objective-C Programming Language (Apple Developer Connection)</a></p>
</li>

<li id="wx653"><wx:template id="wx_t5" pagename="Template:En" page_id="121878"/>
<p id="wx654">(<span style="font-weight:bolder; font-size:80%" id="wx655"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx656">EN</a></span>) <wx:templateend start="wx_t5"/> <i id="wx657"><a href="http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/ObjC.pdf" class="external text" wx:linktype="external" rel="nofollow" id="wx658">The Objective-C Programming Language</a></i></p>
</li>

<li id="wx659"><wx:template id="wx_t6" pagename="Template:En" page_id="121878"/>
<p id="wx660">(<span style="font-weight:bolder; font-size:80%" id="wx661"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx662">EN</a></span>) <wx:templateend start="wx_t6"/> <a href="http://www.toodarkpark.org/computers/objc/" class="external text" wx:linktype="external" rel="nofollow" id="wx663">Object-Oriented Programming and The Objective-C Language</a></p>
</li>

<li id="wx664"><wx:template id="wx_t7" pagename="Template:En" page_id="121878"/>
<p id="wx665">(<span style="font-weight:bolder; font-size:80%" id="wx666"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx667">EN</a></span>) <wx:templateend start="wx_t7"/> <a href="http://developer.apple.com/documentation/ReleaseNotes/Cocoa/Objective-C++.html" class="external text" wx:linktype="external" rel="nofollow" id="wx668">The Objective-C++ Front End</a></p>
</li>

<li id="wx669"><wx:template id="wx_t8" pagename="Template:En" page_id="121878"/>
<p id="wx670">(<span style="font-weight:bolder; font-size:80%" id="wx671"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx672">EN</a></span>) <wx:templateend start="wx_t8"/> <a href="http://www.otierney.net/objective-c.html" class="external text" wx:linktype="external" rel="nofollow" id="wx673">Beginner’s Guide to Objective-C</a></p>
</li>

<li id="wx674"><wx:template id="wx_t9" pagename="Template:En" page_id="121878"/>
<p id="wx675">(<span style="font-weight:bolder; font-size:80%" id="wx676"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx677">EN</a></span>) <wx:templateend start="wx_t9"/> <a href="http://objectivelib.sourceforge.net/" class="external text" wx:linktype="external" rel="nofollow" id="wx678">ObjectiveLib: variant of a Standard Template Library</a></p>
</li>

<li id="wx679"><wx:template id="wx_t10" pagename="Template:En" page_id="121878"/>
<p id="wx680">(<span style="font-weight:bolder; font-size:80%" id="wx681"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx682">EN</a></span>) <wx:templateend start="wx_t10"/> <a href="http://virtualschool.edu/objectivec/" class="external text" wx:linktype="external" rel="nofollow" id="wx683">Objective-C by Brad Cox</a></p>
</li>

<li id="wx684"><wx:template id="wx_t11" pagename="Template:En" page_id="121878"/>
<p id="wx685">(<span style="font-weight:bolder; font-size:80%" id="wx686"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx687">EN</a></span>) <wx:templateend start="wx_t11"/> <a href="http://www.cs.indiana.edu/classes/c304/oop-intro.html" class="external text" wx:linktype="external" rel="nofollow" id="wx688">Object Oriented Programming in Objective-C</a></p>
</li>

<li id="wx689"><wx:template id="wx_t12" pagename="Template:En" page_id="121878"/>
<p id="wx690">(<span style="font-weight:bolder; font-size:80%" id="wx691"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx692">EN</a></span>) <wx:templateend start="wx_t12"/><a href="http://www.faqs.org/faqs/computer-lang/Objective-C/faq/" class="external text" wx:linktype="external" rel="nofollow" id="wx693">Objective-C FAQ</a></p>
</li>

<li id="wx694"><wx:template id="wx_t13" pagename="Template:En" page_id="121878"/>
<p id="wx695">(<span style="font-weight:bolder; font-size:80%" id="wx696"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx697">EN</a></span>) <wx:templateend start="wx_t13"/> <a href="http://thaesofereode.info/clocFAQ/" class="external text" wx:linktype="external" rel="nofollow" id="wx698">comp.lang.objective-C FAQ</a></p>
</li>

<li id="wx699"><wx:template id="wx_t14" pagename="Template:En" page_id="121878"/>
<p id="wx700">(<span style="font-weight:bolder; font-size:80%" id="wx701"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx702">EN</a></span>) <wx:templateend start="wx_t14"/> <a href="http://www.foldr.org/~michaelw/objective-c/" class="external text" wx:linktype="external" rel="nofollow" id="wx703">Objective-C: Links, Resources, Stuff</a></p>
</li>

<li id="wx704"><wx:template id="wx_t15" pagename="Template:En" page_id="121878"/>
<p id="wx705">(<span style="font-weight:bolder; font-size:80%" id="wx706"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx707">EN</a></span>) <wx:templateend start="wx_t15"/> <a href="http://softtecharticles.com/mambo/index.php?option=com_content&amp;task=view&amp;id=32&amp;Itemid=40" class="external text" wx:linktype="external" rel="nofollow" id="wx708">Objective-C A beginners tutorial</a></p>
</li>

<li id="wx709"><wx:template id="wx_t16" pagename="Template:En" page_id="121878"/>
<p id="wx710">(<span style="font-weight:bolder; font-size:80%" id="wx711"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx712">EN</a></span>) <wx:templateend start="wx_t16"/> <a href="news://comp.lang.objective-c" class="external text" wx:linktype="external" rel="nofollow" id="wx713">Newsgroup su Objective-C</a></p>
</li>

<li id="wx714"><wx:template id="wx_t17" pagename="Template:En" page_id="121878"/>
<p id="wx715">(<span style="font-weight:bolder; font-size:80%" id="wx716"><a href="/wit/Lingua_inglese" title="Lingua inglese" wx:linktype="known" wx:pagename="Lingua_inglese" wx:page_id="2523" id="wx717">EN</a></span>) <wx:templateend start="wx_t17"/> <a href="http://www.excelsoftware.com/uml_for_objectivec.pdf" class="external text" wx:linktype="external" rel="nofollow" id="wx718">UML for Objective-C</a></p>
</li>
</ul>

<wx:template id="wx_t18" pagename="Template:Principali_linguaggi_di_programmazione" page_id="62886"/>
<table class="toccolours" style="clear:both; margin-top: 0.5em; margin-left: auto; margin-right: auto;" id="wx719">
<tr id="wx720">
<td style="background-color: #ccccff; text-align: center" id="wx721"><b id="wx722">Principali linguaggi di programmazione</b> <small id="wx723">(<a href="/wit/Categoria:Linguaggi_di_programmazione" title="Categoria:Linguaggi di programmazione" wx:linktype="known" wx:pagename="Categoria:Linguaggi_di_programmazione" wx:page_id="24663" id="wx724">tutti</a>)</small> </td>
</tr>

<tr id="wx725">
<td style="font-size: 90%; text-align: center" id="wx726">
<p id="wx727"><a href="/wit/Ada_%28linguaggio%29" title="Ada (linguaggio)" wx:linktype="known" wx:pagename="Ada_(linguaggio)" wx:page_id="26777" id="wx728">Ada</a> | <a href="/wit/ALGOL" title="ALGOL" wx:linktype="known" wx:pagename="ALGOL" wx:page_id="26618" id="wx729">ALGOL</a> | <a href="/wit/APL" title="APL" wx:linktype="known" wx:pagename="APL" wx:page_id="98801" id="wx730">APL</a> | <a href="/wit/Awk" title="Awk" wx:linktype="known" wx:pagename="Awk" wx:page_id="20789" id="wx731">Awk</a> | <a href="/wit/BASIC" title="BASIC" wx:linktype="known" wx:pagename="BASIC" wx:page_id="26380" id="wx732">BASIC</a> | <a href="/wit/C_%28linguaggio%29" title="C (linguaggio)" wx:linktype="known" wx:pagename="C_(linguaggio)" wx:page_id="26840" id="wx733">C</a> | <a href="/wit/C%2B%2B" title="C++" wx:linktype="known" wx:pagename="C++" wx:page_id="26839" id="wx734">C++</a> | <a href="/wit/C_sharp" title="C sharp" wx:linktype="known" wx:pagename="C_sharp" wx:page_id="26842" id="wx735">C#</a> | <a href="/wit/COBOL" title="COBOL" wx:linktype="known" wx:pagename="COBOL" wx:page_id="12866" id="wx736">COBOL</a> | <a href="/wit/Delphi" title="Delphi" wx:linktype="known" wx:pagename="Delphi" wx:page_id="1590" id="wx737">Delphi</a> | <a href="/wit/Eiffel_%28linguaggio%29" title="Eiffel (linguaggio)" wx:linktype="known" wx:pagename="Eiffel_(linguaggio)" wx:page_id="26848" id="wx738">Eiffel</a> | <a href="/wit/Fortran" title="Fortran" wx:linktype="known" wx:pagename="Fortran" wx:page_id="1897" id="wx739">Fortran</a> | <a href="/wit/Haskell" title="Haskell" wx:linktype="known" wx:pagename="Haskell" wx:page_id="26852" id="wx740">Haskell</a> | <a href="/wit/Interactive_Data_Language" title="Interactive Data Language" wx:linktype="known" wx:pagename="Interactive_Data_Language" wx:page_id="77009" id="wx741">IDL</a> | <a href="/wit/Java_%28linguaggio%29" title="Java (linguaggio)" wx:linktype="known" wx:pagename="Java_(linguaggio)" wx:page_id="26747" id="wx742">Java</a> | <a href="/wit/JavaScript" title="JavaScript" wx:linktype="known" wx:pagename="JavaScript" wx:page_id="2469" id="wx743">JavaScript</a> | <a href="/wit/J_sharp" title="J sharp" wx:linktype="known" wx:pagename="J_sharp" wx:page_id="232095" id="wx744">J#</a> | <a href="/wit/Lisp" title="Lisp" wx:linktype="known" wx:pagename="Lisp" wx:page_id="11078" id="wx745">Lisp</a> | <a href="/wit/Logo_%28informatica%29" title="Logo (informatica)" wx:linktype="known" wx:pagename="Logo_(informatica)" wx:page_id="11890" id="wx746">LOGO</a> | <a href="/wit/ML_programming_language" title="ML programming language" wx:linktype="known" wx:pagename="ML_programming_language" wx:page_id="154750" id="wx747">ML</a> | <a href="/wit/Objective_C" title="Objective C" wx:linktype="self" wx:pagename="Objective_C" wx:page_id="60399" id="wx748">Objective C</a> | <a href="/wit/Objective_Caml" title="Objective Caml" wx:linktype="known" wx:pagename="Objective_Caml" wx:page_id="74464" id="wx749">O'Caml</a> | <a href="/wit/Pascal_%28linguaggio%29" title="Pascal (linguaggio)" wx:linktype="known" wx:pagename="Pascal_(linguaggio)" wx:page_id="3259" id="wx750">Pascal</a> | <a href="/wit/Perl" title="Perl" wx:linktype="known" wx:pagename="Perl" wx:page_id="3227" id="wx751">Perl</a> | <a href="/wit/PHP" title="PHP" wx:linktype="known" wx:pagename="PHP" wx:page_id="3200" id="wx752">PHP</a> | <a href="/wit/PL/I" title="PL/I" wx:linktype="known" wx:pagename="PL/I" wx:page_id="281112" id="wx753">PL/I</a> | <a href="/wit/PLaSM" title="PLaSM" wx:linktype="known" wx:pagename="PLaSM" wx:page_id="205813" id="wx754">PLaSM</a> | <a href="/wit/Prolog" title="Prolog" wx:linktype="known" wx:pagename="Prolog" wx:page_id="3592" id="wx755">Prolog</a> | <a href="/wit/Python" title="Python" wx:linktype="known" wx:pagename="Python" wx:page_id="3366" id="wx756">Python</a> | <a href="/wit/Ruby" title="Ruby" wx:linktype="known" wx:pagename="Ruby" wx:page_id="3684" id="wx757">Ruby</a> | <a href="/wit/SAS_%28linguaggio_di_programmazione%29" title="SAS (linguaggio di programmazione)" wx:linktype="known" wx:pagename="SAS_(linguaggio_di_programmazione)" wx:page_id="81306" id="wx758">SAS</a> | <a href="/wit/Scheme" title="Scheme" wx:linktype="known" wx:pagename="Scheme" wx:page_id="26858" id="wx759">Scheme</a> | <a href="/wit/Bourne_shell" title="Bourne shell" wx:linktype="known" wx:pagename="Bourne_shell" wx:page_id="75147" id="wx760">sh</a> | <a href="/wit/Simula" title="Simula" wx:linktype="known" wx:pagename="Simula" wx:page_id="26745" id="wx761">Simula</a> | <a href="/wit/Smalltalk" title="Smalltalk" wx:linktype="known" wx:pagename="Smalltalk" wx:page_id="26850" id="wx762">Smalltalk</a> | <a href="/wit/SQL" title="SQL" wx:linktype="known" wx:pagename="SQL" wx:page_id="3882" id="wx763">SQL</a> | <a href="/wit/Transact-SQL" title="Transact-SQL" wx:linktype="known" wx:pagename="Transact-SQL" wx:page_id="1492578" id="wx764">Transact-SQL</a> | <a href="/wit/Visual_Basic" title="Visual Basic" wx:linktype="known" wx:pagename="Visual_Basic" wx:page_id="4480" id="wx765">Visual Basic</a></p>
</td>
</tr>
</table>

<wx:templateend start="wx_t18"/>
<wx:template id="wx_t19" pagename="Template:Portale" page_id="949487"/>
<div style="margin-left:0; margin-right:0" id="wx766">
<ul style="display:block; clear:both; list-style-image:none; list-style-type:none; width:100%; vertical-align:middle; margin:0; margin-bottom:1em; padding:0; min-height:27px" id="wx767">
<li style="float:left; height:27px; line-height:25px; width:100%; margin:0; margin-top:.5em; margin-left:0; margin-right:0; padding:0; border:1px solid #CCF; background-color:#F0EEFF" title="Accedi alle voci di Wikipedia che parlano di informatica" id="wx768"><a href="/wit/Immagine:Stub_informatica.png" title="informatica" wx:linktype="image" wx:pagename="Immagine:Stub_informatica.png" wx:page_id="584308" id="wx769"><img src="/wit/Immagine:Stub_informatica.png" alt="informatica" width="25" height="25" id="wx770"/></a> <b id="wx771"><a href="/wit/Portale:informatica" class="new" title="Portale:informatica" wx:linktype="unknown" wx:pagename="Portale:informatica" id="wx772">Portale Informatica</a></b>
<p id="wx773">:  accedi alle voci di Wikipedia che parlano di informatica</p>
</li>
</ul>
</div>

<wx:templateend start="wx_t19"/>
</wx:section></wx:section></div>
<div id="wx_categorylinks">
<a href="/wit/index.php?title=Speciale:Categories&amp;article=Objective_C" title="Speciale:Categories" wx:linktype="known" wx:pagename="Speciale:Categories" id="wx774">Categoria</a>: <span dir="ltr" id="wx775"><a href="/wit/Categoria:Linguaggi_di_programmazione" title="Categoria:Linguaggi di programmazione" wx:linktype="known" wx:pagename="Categoria:Linguaggi_di_programmazione" wx:page_id="24663" id="wx776">Linguaggi di programmazione</a></span></div>
<div id="wx_languagelinks">
Altre lingue: <a href="http://bg.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="bg:Objective-C" id="wx777">Български</a> | <a href="http://cs.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="cs:Objective-C" id="wx778">Česky</a> | <a href="http://da.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="da:Objective-C" id="wx779">Dansk</a> | <a href="http://de.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="de:Objective-C" id="wx780">Deutsch</a> | <a href="http://en.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="en:Objective-C" id="wx781">English</a> | <a href="http://eo.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="eo:Objective-C" id="wx782">Esperanto</a> | <a href="http://es.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="es:Objective-C" id="wx783">Español</a> | <a href="http://fi.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="fi:Objective-C" id="wx784">Suomi</a> | <a href="http://fr.wikipedia.org/wiki/Objective_C" class="external" wx:linktype="interwiki" wx:pagename="fr:Objective_C" id="wx785">Français</a> | <a href="http://hu.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="hu:Objective-C" id="wx786">Magyar</a> | <a href="http://ja.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="ja:Objective-C" id="wx787">日本語</a> | <a href="http://ko.wikipedia.org/wiki/%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8B%B0%EB%B8%8C-C" class="external" wx:linktype="interwiki" wx:pagename="ko:오브젝티브-C" id="wx788">한국어</a> | <a href="http://nl.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="nl:Objective-C" id="wx789">Nederlands</a> | <a href="http://no.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="no:Objective-C" id="wx790">Norsk (bokmål)</a> | <a href="http://pl.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="pl:Objective-C" id="wx791">Polski</a> | <a href="http://pt.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="pt:Objective-C" id="wx792">Português</a> | <a href="http://ru.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="ru:Objective-C" id="wx793">Русский</a> | <a href="http://sk.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="sk:Objective-C" id="wx794">Slovenčina</a> | <a href="http://sv.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="sv:Objective-C" id="wx795">Svenska</a> | <a href="http://tg.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="tg:Objective-C" id="wx796">Тоҷикӣ</a> | <a href="http://th.wikipedia.org/wiki/%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2%E0%B8%AD%E0%B9%87%E0%B8%AD%E0%B8%9A%E0%B9%80%E0%B8%88%E0%B8%81%E0%B8%97%E0%B8%B5%E0%B8%9F-%E0%B8%8B%E0%B8%B5" class="external" wx:linktype="interwiki" wx:pagename="th:ภาษาอ็อบเจกทีฟ-ซี" id="wx797">ไทย</a> | <a href="http://tr.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="tr:Objective-C" id="wx798">Türkçe</a> | <a href="http://uk.wikipedia.org/wiki/Objective_C" class="external" wx:linktype="interwiki" wx:pagename="uk:Objective_C" id="wx799">Українська</a> | <a href="http://zh.wikipedia.org/wiki/Objective-C" class="external" wx:linktype="interwiki" wx:pagename="zh:Objective-C" id="wx800">中文</a></div>
</body>
<wx:templatearguments for="wx_t1"/>
<wx:templatearguments for="wx_t2"><wx:argument name="b">
<p id="wx801">Objective-C</p>
</wx:argument></wx:templatearguments>
<wx:templatearguments for="wx_t3"/>
<wx:templatearguments for="wx_t4"/>
<wx:templatearguments for="wx_t5"/>
<wx:templatearguments for="wx_t6"/>
<wx:templatearguments for="wx_t7"/>
<wx:templatearguments for="wx_t8"/>
<wx:templatearguments for="wx_t9"/>
<wx:templatearguments for="wx_t10"/>
<wx:templatearguments for="wx_t11"/>
<wx:templatearguments for="wx_t12"/>
<wx:templatearguments for="wx_t13"/>
<wx:templatearguments for="wx_t14"/>
<wx:templatearguments for="wx_t15"/>
<wx:templatearguments for="wx_t16"/>
<wx:templatearguments for="wx_t17"/>
<wx:templatearguments for="wx_t18"/>
<wx:templatearguments for="wx_t19"><wx:argument name="1">
<p id="wx802">informatica</p>
</wx:argument></wx:templatearguments>
</html>
