<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>MacDeveloper</title>
	
	<link>http://macdev.netsons.org</link>
	<description>Appunti di Programmazione in Mac OS X</description>
	<lastBuildDate>Fri, 20 Nov 2009 10:17:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/macdev" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Installare Django su Snow Leopard</title>
		<link>http://feedproxy.google.com/~r/macdev/~3/3p-_10EGdOE/</link>
		<comments>http://macdev.netsons.org/guide/installare-django-su-snow-leopard/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 10:15:47 +0000</pubDate>
		<dc:creator>Francesco P.</dc:creator>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://macdev.netsons.org/?p=127</guid>
		<description><![CDATA[<p>Installare l&#8217;ultima versione stabile di Django su Snow Leopard è molto semplice. Ecco come fare:</p>
<ol>
<li><a href="http://www.djangoproject.com/download/">Scaricate</a> l&#8217;archivio dal sito del progetto</li>
<li>Estraetelo</li>
<li>Da <em>Terminal</em> navigate fino alla cartella appena estratta</li>
<li>Eseguite il comando <code>sudo python setup.py install</code></li>
</ol>
<p>A questo punto l&#8217;installazione dovrebbe essere terminata. Per testare il&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Installare l&#8217;ultima versione stabile di Django su Snow Leopard è molto semplice. Ecco come fare:</p>
<ol>
<li><a href="http://www.djangoproject.com/download/">Scaricate</a> l&#8217;archivio dal sito del progetto</li>
<li>Estraetelo</li>
<li>Da <em>Terminal</em> navigate fino alla cartella appena estratta</li>
<li>Eseguite il comando <code>sudo python setup.py install</code></li>
</ol>
<p>A questo punto l&#8217;installazione dovrebbe essere terminata. Per testare il funzionamento del framework sempre da <em>Terminal</em>:</p>
<ol>
<li>Aprite la console interattiva di Python digitando <code>python</code></li>
<li>Importate Django tramite il comando <code>import django</code></li>
<li>Eseguite <code>django.VERSION</code></li>
<li>Se l&#8217;installazione è andata a buon fine dovreste ottenere qualcosa di simile a <code>(1, 1, 1, 'final', 0)</code> in base alla versione scaricata</li>
</ol>
<img src="http://feeds.feedburner.com/~r/macdev/~4/3p-_10EGdOE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://macdev.netsons.org/guide/installare-django-su-snow-leopard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://macdev.netsons.org/guide/installare-django-su-snow-leopard/</feedburner:origLink></item>
		<item>
		<title>Google Wave</title>
		<link>http://feedproxy.google.com/~r/macdev/~3/w6lJ2u_V5i8/</link>
		<comments>http://macdev.netsons.org/altro/google-wave/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 08:58:12 +0000</pubDate>
		<dc:creator>Francesco P.</dc:creator>
				<category><![CDATA[Altro]]></category>
		<category><![CDATA[Google Wave]]></category>

		<guid isPermaLink="false">http://macdev.netsons.org/?p=120</guid>
		<description><![CDATA[<p>Ho appena ricevuto un invito a Google Wave e per testarlo ho bisogno di contatti! Se avete un account aggiungetemi pure tramite l&#8217;indirizzo papagno chiocciola googlewave.com</p>
<p><a href="http://macdev.netsons.org/wp-content/uploads/google_wave.png"><img class="aligncenter size-full wp-image-121" title="google_wave" src="http://macdev.netsons.org/wp-content/uploads/google_wave.png" alt="google_wave" width="500" height="326" /></a></p>
]]></description>
			<content:encoded><![CDATA[<p>Ho appena ricevuto un invito a Google Wave e per testarlo ho bisogno di contatti! Se avete un account aggiungetemi pure tramite l&#8217;indirizzo papagno chiocciola googlewave.com</p>
<p><a href="http://macdev.netsons.org/wp-content/uploads/google_wave.png"><img class="aligncenter size-full wp-image-121" title="google_wave" src="http://macdev.netsons.org/wp-content/uploads/google_wave.png" alt="google_wave" width="500" height="326" /></a></p>
<img src="http://feeds.feedburner.com/~r/macdev/~4/w6lJ2u_V5i8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://macdev.netsons.org/altro/google-wave/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://macdev.netsons.org/altro/google-wave/</feedburner:origLink></item>
		<item>
		<title>Installare Oracle 10G su Leopard</title>
		<link>http://feedproxy.google.com/~r/macdev/~3/PMu68toZ9YA/</link>
		<comments>http://macdev.netsons.org/guide/installare-oracle-10g-su-leopard/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 20:26:11 +0000</pubDate>
		<dc:creator>Francesco P.</dc:creator>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://macdev.netsons.org/?p=79</guid>
		<description><![CDATA[<p>In questa guida vedremo come installare <em>Oracle 10G</em> su Leopard. Innanzitutto controlliamo che i <em>prerequisiti di installazione</em> siano rispettati:</p>
<ul>
<li>Mac OS X 10.5.4 o superiore</li>
<li>Xcode 3.0 installato<sup>[1]</sup></li>
<li>5 GB di spazio su disco</li>
<li>Almeno 1 GB di RAM</li>
</ul>
<p><span id="more-79"></span></p>
<p>Per installare <em>Oracle</em> è necessario creare un nuovo utente&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>In questa guida vedremo come installare <em>Oracle 10G</em> su Leopard. Innanzitutto controlliamo che i <em>prerequisiti di installazione</em> siano rispettati:</p>
<ul>
<li>Mac OS X 10.5.4 o superiore</li>
<li>Xcode 3.0 installato<sup>[1]</sup></li>
<li>5 GB di spazio su disco</li>
<li>Almeno 1 GB di RAM</li>
</ul>
<p><span id="more-79"></span></p>
<p>Per installare <em>Oracle</em> è necessario creare un nuovo utente ed un gruppo dedicati. Supponendo di voler utilizzare GUI e UID 4200, assicuriamoci che siano disponibili digitando dal terminale:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">dscl . <span style="color: #660033;">-list</span> <span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">groups</span> gid <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #000000;">4200</span>
dscl . <span style="color: #660033;">-list</span> <span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">users</span> uid <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #000000;">4200</span></pre></div></div>

<p>A questo punto creiamo <em>gruppo ed utente</em> digitando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-create</span> <span style="color: #000000; font-weight: bold;">/</span>groups<span style="color: #000000; font-weight: bold;">/</span>dba
<span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-append</span> <span style="color: #000000; font-weight: bold;">/</span>groups<span style="color: #000000; font-weight: bold;">/</span>dba gid <span style="color: #000000;">4200</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-append</span> <span style="color: #000000; font-weight: bold;">/</span>groups<span style="color: #000000; font-weight: bold;">/</span>dba <span style="color: #c20cb9; font-weight: bold;">passwd</span> <span style="color: #ff0000;">&quot;*&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-create</span> <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>oracle
<span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-append</span> <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>oracle uid <span style="color: #000000;">4200</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-append</span> <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>oracle gid <span style="color: #000000;">4200</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-append</span> <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>oracle shell <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">bash</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-append</span> <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>oracle home <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>oracle
<span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-append</span> <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>oracle realname <span style="color: #ff0000;">&quot;Oracle software owner&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>oracle
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chown</span> oracle:dba <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>oracle
<span style="color: #c20cb9; font-weight: bold;">sudo</span> defaults <span style="color: #c20cb9; font-weight: bold;">write</span> <span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Preferences<span style="color: #000000; font-weight: bold;">/</span>com.apple.loginwindow HiddenUsersList <span style="color: #660033;">-array-add</span> oracle
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">passwd</span> oracle</pre></div></div>

<p>Ora è necessario modificare alcuni <em>parametri del kernel</em> aggiungendo al file /etc/sysctl.conf queste righe:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">kern.sysv.shmall=<span style="color: #000000;">2097152</span>
kern.sysv.shmmni=<span style="color: #000000;">4096</span>
kern.maxproc=<span style="color: #000000;">1024</span>
kern.maxprocperuid=<span style="color: #000000;">512</span></pre></div></div>

<p>Riavviamo e controlliamo che i parametri siano impostati correttamente:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">sysctl kern.sysv.shmall <span style="color: #666666; font-style: italic;"># 2097152</span>
sysctl kern.sysv.shmmni <span style="color: #666666; font-style: italic;"># 4096</span>
sysctl kern.maxproc <span style="color: #666666; font-style: italic;"># 1024</span>
sysctl kern.maxprocperuid <span style="color: #666666; font-style: italic;"># 512</span></pre></div></div>

<p>Ora creiamo il file ~/.bash_profile nella home dell&#8217;utente oracle con il seguente contenuto:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Deve corrispondere a kern.maxprocperuid</span>
<span style="color: #7a0874; font-weight: bold;">ulimit</span> <span style="color: #660033;">-Hu</span> <span style="color: #000000;">512</span>
<span style="color: #7a0874; font-weight: bold;">ulimit</span> <span style="color: #660033;">-Su</span> <span style="color: #000000;">512</span>
<span style="color: #666666; font-style: italic;"># Deve corrispondere a kern.maxfilesperproc</span>
<span style="color: #7a0874; font-weight: bold;">ulimit</span> <span style="color: #660033;">-Hn</span> <span style="color: #000000;">10240</span>
<span style="color: #7a0874; font-weight: bold;">ulimit</span> <span style="color: #660033;">-Sn</span> <span style="color: #000000;">10240</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_BASE</span>=<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>oracle
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_HOME</span>=<span style="color: #007800;">$ORACLE_BASE</span><span style="color: #000000; font-weight: bold;">/</span>product<span style="color: #000000; font-weight: bold;">/</span>10.2.0<span style="color: #000000; font-weight: bold;">/</span>db_1
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">DYLD_LIBRARY_PATH</span>=<span style="color: #007800;">$ORACLE_HOME</span><span style="color: #000000; font-weight: bold;">/</span>lib
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_SID</span>=mac10g
<span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$ORACLE_HOME</span><span style="color: #000000; font-weight: bold;">/</span>bin</pre></div></div>

<p>A questo punto ci autentichiamo come utente &#8220;oracle&#8221; tramite il comando &#8220;su &#8211; oracle&#8221; e digitiamo:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">DISPLAY</span>=localhost:<span style="color: #000000;">0</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ORACLE_HOSTNAME</span>=localhost</pre></div></div>

<p>Abbiamo terminato la configurazione del sistema. Ora non ci resta che eseguire l&#8217;installer. Supponendo di aver scaricato Oracle 10G e di aver scompattato l&#8217;archivio nella home dell&#8217;utente &#8220;oracle&#8221;, basterà digitare il comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>oracle<span style="color: #000000; font-weight: bold;">/</span>db<span style="color: #000000; font-weight: bold;">/</span>Disk1<span style="color: #000000; font-weight: bold;">/</span>runInstaller</pre></div></div>

<p>Dopo aver seguito i semplici passi dell&#8217;<em>Oracle Universal Installer</em>, <em>Oracle 10G</em> sarà correttamente installato sul nostro mac!</p>
<b>Note</b><ol class="footnotes"><li id="footnote_0_79" class="footnote">Potete trovarlo nel DVD di installazione di Mac OS X</li></ol><img src="http://feeds.feedburner.com/~r/macdev/~4/PMu68toZ9YA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://macdev.netsons.org/guide/installare-oracle-10g-su-leopard/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://macdev.netsons.org/guide/installare-oracle-10g-su-leopard/</feedburner:origLink></item>
		<item>
		<title>Corso di programmazione iPhone dalla Stanford University</title>
		<link>http://feedproxy.google.com/~r/macdev/~3/iQwLBnMk2AI/</link>
		<comments>http://macdev.netsons.org/news/corso-di-programmazione-iphone-dalla-stanford-university/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 08:53:10 +0000</pubDate>
		<dc:creator>Francesco P.</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Cocoa Touch]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://macdev.netsons.org/?p=72</guid>
		<description><![CDATA[<p>La <a href="http://stanford.edu">Stanford University</a> ha deciso di offrire tramite iTunes U<sup>[1]</sup> un corso di programmazione per iPhone.</p>
<p>Le lezioni sono tenute da ingegneri Apple e sono disponibili in formato video della durata di circa un&#8217;ora ciascuna. E&#8217; possibile scaricare anche le slide delle lezioni&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>La <a href="http://stanford.edu">Stanford University</a> ha deciso di offrire tramite iTunes U<sup>[1]</sup> un corso di programmazione per iPhone.</p>
<p>Le lezioni sono tenute da ingegneri Apple e sono disponibili in formato video della durata di circa un&#8217;ora ciascuna. E&#8217; possibile scaricare anche le slide delle lezioni in formato PDF.</p>
<p>Per chi fosse interessato a seguire il corso ci sono due link fondamentali:</p>
<ul>
<li><a href="http://deimos3.apple.com/WebObjects/Core.woa/Browse/itunes.stanford.edu.2024353965.02024353968">Il podcast su iTunes U</a></li>
<li><a href="http://www.stanford.edu/class/cs193p/cgi-bin/index.php">Il sito del corso</a></li>
</ul>
<b>Note</b><ol class="footnotes"><li id="footnote_0_72" class="footnote">iTunes U è una sezione dell&#8217;iTunes Store interamente dedicata agli studenti nella quale è possibile trovare lezioni gratuite su diversi argomenti sotto forma di podcast.</li></ol><img src="http://feeds.feedburner.com/~r/macdev/~4/iQwLBnMk2AI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://macdev.netsons.org/news/corso-di-programmazione-iphone-dalla-stanford-university/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://macdev.netsons.org/news/corso-di-programmazione-iphone-dalla-stanford-university/</feedburner:origLink></item>
		<item>
		<title>AsyncSocket: Cocoa e le socket</title>
		<link>http://feedproxy.google.com/~r/macdev/~3/gXZ272juEFc/</link>
		<comments>http://macdev.netsons.org/articoli/asyncsocket-cocoa-e-le-socket/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 22:05:30 +0000</pubDate>
		<dc:creator>Francesco P.</dc:creator>
				<category><![CDATA[Articoli]]></category>
		<category><![CDATA[AsyncSocket]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Socket]]></category>

		<guid isPermaLink="false">http://macdev.netsons.org/?p=56</guid>
		<description><![CDATA[<p>Dopo l&#8217;articolo su <a href="http://macdev.netsons.org/articoli/netsocket-un-wrapper-di-cfsocket/">NetSocket</a> torno a parlare delle socket in Cocoa.</p>
<p><strong>AsyncSocket</strong> è un framework che consente l&#8217;utilizzo asincrono delle socket tramite l&#8217;uso dei delegati. Ecco le sue caratteristiche:</p>
<ul>
<li><strong>Protocolli supportati</strong>: TCP</li>
<li><strong>Buffered I/O</strong>: Si</li>
<li><strong>I/O Asincrono</strong>: Si, tramite i delegati (opzionali)</li>
<li><strong>Documentazione</strong>: Si</li>
</ul>
<p>Dalla versione 4.3 AsyncSocket&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Dopo l&#8217;articolo su <a href="http://macdev.netsons.org/articoli/netsocket-un-wrapper-di-cfsocket/">NetSocket</a> torno a parlare delle socket in Cocoa.</p>
<p><strong>AsyncSocket</strong> è un framework che consente l&#8217;utilizzo asincrono delle socket tramite l&#8217;uso dei delegati. Ecco le sue caratteristiche:</p>
<ul>
<li><strong>Protocolli supportati</strong>: TCP</li>
<li><strong>Buffered I/O</strong>: Si</li>
<li><strong>I/O Asincrono</strong>: Si, tramite i delegati (opzionali)</li>
<li><strong>Documentazione</strong>: Si</li>
</ul>
<p>Dalla versione 4.3 AsyncSocket non è più stato aggiornato da <strong>Dustin Voss</strong>, in compenso però i programmatori di <a href="http://www.deusty.com">Deusty</a> stanno portando avanti lo sviluppo del framework.</p>
<p>Il progetto è disponibile su <a href="http://code.google.com/p/cocoaasyncsocket/">Google Code</a> sotto licenza <strong>MIT</strong> ed ora supporta anche il protocollo <strong>UDP</strong>.</p>
<h3>Link utili</h3>
<ul>
<li><a href="http://homepage.mac.com/d_j_v/FileSharing4.html">AsyncSocket homepage</a></li>
<li><a href="http://code.google.com/p/cocoaasyncsocket/">AsyncSocket su Google Code</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/macdev/~4/gXZ272juEFc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://macdev.netsons.org/articoli/asyncsocket-cocoa-e-le-socket/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://macdev.netsons.org/articoli/asyncsocket-cocoa-e-le-socket/</feedburner:origLink></item>
		<item>
		<title>Installare Django su Leopard</title>
		<link>http://feedproxy.google.com/~r/macdev/~3/rKWQTt6AZ2U/</link>
		<comments>http://macdev.netsons.org/guide/installare-django-su-leopard/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 13:59:21 +0000</pubDate>
		<dc:creator>Francesco P.</dc:creator>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.macdev.netsons.org/blog/?p=37</guid>
		<description><![CDATA[<p>Installare Django su Leopard è molto semplice, infatti questo include già numerosi requisiti che andavano installati manualmente con Tiger.</p>
<p>Innanizitutto è necessario installare xCode dal DVD di Leopard. A questo punto possiamo passare al download dell&#8217;ultima versione di sviluppo di Django&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Installare Django su Leopard è molto semplice, infatti questo include già numerosi requisiti che andavano installati manualmente con Tiger.</p>
<p>Innanizitutto è necessario installare xCode dal DVD di Leopard. A questo punto possiamo passare al download dell&#8217;ultima versione di sviluppo di Django tramite Subversion. Creiamo quindi la directory che la conterrà:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>django
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>django</pre></div></div>

<p>E scarichiamo Django:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">svn</span> <span style="color: #c20cb9; font-weight: bold;">co</span> http:<span style="color: #000000; font-weight: bold;">//</span>code.djangoproject.com<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span>django<span style="color: #000000; font-weight: bold;">/</span>trunk<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>Ora dobbiamo far sapere a Python dove si trova Django:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>django<span style="color: #000000; font-weight: bold;">/</span>trunk<span style="color: #000000; font-weight: bold;">/</span>django <span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Python<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2.5</span><span style="color: #000000; font-weight: bold;">/</span>site-packages<span style="color: #000000; font-weight: bold;">/</span>django</pre></div></div>

<p>e copiare lo script <em>django-admin.py</em> nel nostro path di sistema:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>django<span style="color: #000000; font-weight: bold;">/</span>trunk<span style="color: #000000; font-weight: bold;">/</span>django<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>django-admin.py <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>A questo punto l&#8217;installazione è terminata e Django dovrebbe essere pronto all&#8217;uso. Per testarlo creiamo un nuovo progetto ed eseguiamolo in locale:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">django-admin.py startproject nome
<span style="color: #7a0874; font-weight: bold;">cd</span> nome
python manage.py runserver</pre></div></div>

<p>Ora verifichiamo se tutto funziona correttamente all&#8217;indirizzo <a href="http://localhost:8000">localhost:8000</a>.</p>
<img src="http://feeds.feedburner.com/~r/macdev/~4/rKWQTt6AZ2U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://macdev.netsons.org/guide/installare-django-su-leopard/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://macdev.netsons.org/guide/installare-django-su-leopard/</feedburner:origLink></item>
		<item>
		<title>Imparare Objective-C</title>
		<link>http://feedproxy.google.com/~r/macdev/~3/sSg78WXE1jQ/</link>
		<comments>http://macdev.netsons.org/guide/imparare-objective-c/#comments</comments>
		<pubDate>Mon, 05 May 2008 21:48:39 +0000</pubDate>
		<dc:creator>Francesco P.</dc:creator>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Objective-C]]></category>

		<guid isPermaLink="false">http://www.macdev.netsons.org/blog/?p=9</guid>
		<description><![CDATA[<h3>Introduzione</h3>
<p><em>Objective-C</em> è il linguaggio maggiormente usato per scrivere software in ambiente Mac. Se avete già delle conoscenze sulla programmazione orientata ad oggetti e sulla sintassi del linguaggio C allora imparare <em>Objective-C</em> sarà un passo semplice per voi. Altrimenti sarebbe meglio approfondire prima&#8230;</p>]]></description>
			<content:encoded><![CDATA[<h3>Introduzione</h3>
<p><em>Objective-C</em> è il linguaggio maggiormente usato per scrivere software in ambiente Mac. Se avete già delle conoscenze sulla programmazione orientata ad oggetti e sulla sintassi del linguaggio C allora imparare <em>Objective-C</em> sarà un passo semplice per voi. Altrimenti sarebbe meglio approfondire prima i concetti riguardanti la OOP e il linguaggio C.</p>
<p><span id="more-9"></span></p>
<h3>Invocare i metodi</h3>
<p>Per cominciare più in fretta possibile, guardiamo alcuni esempi di codice. La sintassi di base per richiamare un metodo appartenente ad un oggetto è la seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>object method<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>object methodWithInput<span style="color: #002200;">:</span>input<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Ovviamente i metodi possono restituire dei valori nel seguente modo:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">output <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>object methodWithOutput<span style="color: #002200;">&#93;</span>;
output <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>object methodWithInputAndOutput<span style="color: #002200;">:</span>input<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>E&#8217; possibile richiamare anche dei metodi appartenenti alle classi, che tra l&#8217;altro è il modo in cui queste vengono istanziate. Nell&#8217;esempio di seguito invochiamo un metodo della classe <em>NSString</em> che ci restituisce una istanza della classe stessa:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">id</span> myObject <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> <span style="color: #a61390;">string</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Il tipo <em>id</em> può contenere un oggetto di qualsiasi tipo. Questo rende possibile scrivere codice in modo dinamico senza sapere a priori cosa una determinata variabile conterrà in runtime.</p>
<p>In questo esempio la variabile conterrà una stringa quindi possiamo anche modificare il suo tipo in <em>NSString</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> myString <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> <span style="color: #a61390;">string</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>In questo modo ora il compilatore potrà avvisarci se cercheremo di usare un metodo su questo oggetto che non supporta la classe <em>NSString</em>.</p>
<p>Da notare che di seguito al tipo dell&#8217;oggetto c&#8217;è un asterico. Tutti gli oggetti in <em>Objective-C</em> sono di tipo puntatore. Per il tipo <em>id</em> invece, che è di default un tipo puntatore, non va specificato l&#8217;asterisco.</p>
<h3>Messaggi annidati</h3>
<p>Nella maggior parte dei linguaggi la chiamata di metodi o funzioni annidati appare in questo modo:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">function1 <span style="color: #009900;">&#40;</span>function2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Il risultato di <em>function2</em> viene passato in input a <em>function1</em>. In <em>Objective-C</em> i messaggi annidati funzionano in questo modo:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>prefs format<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Annidare più di due messaggi in una singola istruzione va evitato perchè riduce la leggibilità del codice stesso.</p>
<h3>Metodi con input multiplo</h3>
<p>Alcuni metodi prendono in input più di un valore. In <em>Objective-C</em>, il nome di un metodo può essere scomposto in più parti. L&#8217;intestazione di un metodo con più valori in input quindi apparirà così:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>writeToFile<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>path atomically<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>useAuxiliaryFile;</pre></div></div>

<p>Il metodo verrà poi chiamato in questo modo:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">BOOL</span> result <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>myData writeToFile<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;/tmp/log.txt&quot;</span> atomically<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Il nome del metodo sarà quindi <em>writeToFile:atomically</em>.</p>
<h3>Variabili private</h3>
<p>Tutte le variabili di istanza sono private per default in <em>Objective-C</em>, quindi è necessario utilizzare gli <em>accessor</em> per prelevare il loro valore.</p>
<p>Ecco la sintassi per <em>Objective-C 1.x</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>photo setCaption<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Day at the Beach&quot;</span><span style="color: #002200;">&#93;</span>;
output <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>photo caption<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Da notare che nella seconda riga non si sta accedendo direttamente alla variabile <em>caption</em>, ma si sta chiamando un metodo get con quel nome. In molti casi infatti non viene aggiunto il prefisso get per i getter in <em>Objective-C</em>.</p>
<p>Con <em>Mac OS X 10.5</em> e <em>Objective-C 2.0</em> è stata introdotta la sintassi puntata per i getter e i setter. Ad esempio:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">photo.caption <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Day at the Beach&quot;</span>;
output <span style="color: #002200;">=</span> photo.caption;</pre></div></div>

<p>E&#8217; possibile utilizzare entrambi gli stili ma è preferibile sceglierne uno. Inoltre la notazione puntata dovrebbe essere utilizzata solamente per i metodi setter e getter e non per tutti gli altri metodi.</p>
<h3>Creare gli oggetti</h3>
<p>Ci sono due modi per creare un oggetto. Il primo è quello visto in precedenza:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> myString <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> <span style="color: #a61390;">string</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>L&#8217;altro invece, che vedremo in dettaglio più tardi, è questo:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> myString <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Questa è una chiamata annidata di metodi. Il primo è <em>alloc</em> che appartiene a <em>NSString</em> ed è un metodo di basso livello che riserva la memoria e istanzia l&#8217;oggetto.</p>
<p>Il secondo metodo invece, <em>init</em>, inizializza il nuovo oggetto. Di solito questo metodo è utilizzato per creare le variabili istanza della classe.</p>
<p>In alcuni casi è necessario utilizzare una versione con input del metodo <em>init</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSNumber</span><span style="color: #002200;">*</span> value <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNumber</span> alloc<span style="color: #002200;">&#93;</span> initWithFloat<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<h3>Gestione della memoria</h3>
<p>Quando si sviluppano applicazioni per OS X si può attivare il <em>garbage collector</em>. Questo vuol dire che non è necessario pensare alla gestione della memoria tranne in alcuni casi particolari.</p>
<p>Comunque non è detto che ci si troverà sempre a sviluppare applicazioni in un ambiente che supporta il <em>garbage collector</em> e in questi casi sarà fondamentale conoscere alcuni concetti di base.</p>
<p>Quando creiamo un oggetto attraverso l&#8217;allocazione manuale sarà anche necessario rilasciare l&#8217;oggetto. E&#8217; inoltre necessario stare attenti a non cercare di rilasciare un oggetto già rilasciato in automatico perchè causeremmo il crash dell&#8217;applicazione.</p>
<p>Di seguito due esempi:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// string1 verrà rilasciata automaticamente</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> string1 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> <span style="color: #a61390;">string</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// string2 viene incece rilasciata manualmente</span>
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> string2 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>string2 release<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Ci sono ovviamente altre cose da sapere sulla gestione della memoria ma le vedremo dopo aver spiegato altri concetti.</p>
<h3>Creare una Class Interface</h3>
<p>La sintassi dell&#8217;<em>Objective-C</em> per creare delle nuove classi è molto semplice e si divide in due parti.</p>
<p>L&#8217;interfaccia della classe è situata nel file <em>NomeDellaClasse.h</em> e definisce le variabili d&#8217;istanza e i metodi pubblici della stessa.</p>
<p>L&#8217;implementazione invece viene scritta nel file <em>NomeDellaClasse.m</em> che contiene il codice per i metodi. Inoltre in questo file vengono definiti metodi privati che non saranno visibili all&#8217;esterno della classe.</p>
<p>Ecco un esempio di interfaccia di una classe. La classe si chiama <em>Photo</em> quindi l&#8217;interfaccia si troverà nel file <em>Photo.h</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import</span>
&nbsp;
<span style="color: #a61390;">@interface</span> Photo <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> caption;
    <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> photographer;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Prima di tutto importiamo <em>Cocoa.h</em> per avere a disposizione le classi base del framework <em>Cocoa</em>. La direttiva <em>#import</em> garantisce che uno stesso file non venga importato più volte.</p>
<p><em>@interface</em> serve invece ad indicare che si sta dichiarando una classe. I due punti invece specificano la superclasse che in questo caso è <em>NSObject</em>.</p>
<p>All&#8217;interno delle parentesi graffe abbiamo poi due variabili d&#8217;istanza: <em>caption</em> e <em>photographer</em>. Entrambe sono di tipo <em>NSString</em> ma potrebbero essere di qualsiasi altro tipo incluso <em>id</em>.</p>
<p>Infine abbiamo <em>@end</em> che chiude la dichiarazione della classe.</p>
<h3>Aggiungere metodi</h3>
<p>Ora andiamo ad aggiungere due metodi getter per le variabili.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import</span>
&nbsp;
<span style="color: #a61390;">@interface</span> Photo <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> caption;
    <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> photographer;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> caption;
<span style="color: #002200;">-</span> photographer;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Ricordatevi che in <em>Objective-C</em> i metodi non includono il prefisso get. Il simbolo &#8220;-&#8221; prima del metodo indica che si tratta di metodi d&#8217;istanza. Il segno &#8220;+&#8221; invece è usato per i metodi di classe.</p>
<p>Per default il compilatore assume che il metodo ritorni un oggetto di tipo <em>id</em> e che tutti i valori in input siano di tipo <em>id</em>. Il codice visto sopra è quindi corretto ma è sicuramente inusuale. Aggiungiamo quindi un tipo specifico come valore di ritorno dei nostri metodi.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import</span>
&nbsp;
<span style="color: #a61390;">@interface</span> Photo <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> caption;
    <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> photographer;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> caption;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> photographer;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Ora aggiungiamo invece i metodi setter.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import</span>
&nbsp;
<span style="color: #a61390;">@interface</span> Photo <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> caption;
    <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> photographer;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> caption;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> photographer;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setCaption<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>input;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setPhotographer<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>input;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Questi metodi non neccessitano di restituire un valore quindi li dichiareremo di tipo <em>void</em>.</p>
<h3>Implementare l&#8217;interfaccia di una classe</h3>
<p>Vediamo ora la parte implementativa della classe a partire dai metodi getter.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;Photo.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> Photo
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> caption <span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> caption;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> photographer <span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> photographer;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Questa parte di codice inizia con <em>@implementation</em> seguito dal nome della classe e finisce con <em>@end</em> come per l&#8217;interfaccia. Tutti i metodi dovranno apparire tra queste due righe.</p>
<p>I metodi getter presenti nel codice dell&#8217;esempio saranno molto familiari a chiunque abbia mai scritto del codice. Possiamo quindi passare ai setter che necessitano di qualche spiegazione in più.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setCaption<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>input <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>caption autorelease<span style="color: #002200;">&#93;</span>;
    caption <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>input retain<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setPhotographer<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>input <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>photographer autorelease<span style="color: #002200;">&#93;</span>;
    photographer <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>input retain<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Ognuno dei due metodi lavora su due variabili. La prima è un rigerimento all&#8217;oggetto esistente mentre la seconda è un oggetto passato in input.</p>
<p>In un ambiente che supporti il garbage collector potremmo semplicemente assegnare il nuovo valore:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setCaption<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>input <span style="color: #002200;">&#123;</span>
    caption <span style="color: #002200;">=</span> input;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Se però non disponiamo di un <em>garbage collector</em> dobbiamo rilasciare l&#8217;oggetto e possiamo farlo in due modi: con <em>release</em> e con <em>autorelease</em>. Con <em>release</em> l&#8217;oggetto verrà rilasciato immediatamente mentre con <em>autorelease</em> l&#8217;oggetto verrà rilasciato non appena il metodo corrente termina.</p>
<p>Il metodo <em>autorelease</em> è più sicuro nei metodi setter. Potremmo infatti accidentalmente rilasciare un oggetto che avremmo poi dovuto restituire.</p>
<p>Probabilmente ora sarete un po confusi ma andando avanti tutto sarà più chiaro. Non è necessario aver capito tutto sino ad ora.</p>
<h3>Il metodo init</h3>
<p>Per la nostra classe potremmo prevedere un metodo <em>init</em> che imposti i valori iniziali alle variabili d&#8217;istanza:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> init <span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span> <span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
        <span style="color: #002200;">&#91;</span>self setCaption<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Default Caption&quot;</span><span style="color: #002200;">&#93;</span>;
        <span style="color: #002200;">&#91;</span>self setPhotographer<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Default Photographer&quot;</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>L&#8217;unica istruzione che potrebbe richiedere delle spiegazioni in questo codice è la seconda nella quale viene assegnato a <em>self</em> il risultato di <em>[super init]</em>.</p>
<p>Questo serve solamente a chiedere alla superclasse di effettuare le inizializzazioni necessarie. L&#8217;if è necessario per controllare che l&#8217;inizializzazione sia avvenuta con successo.</p>
<h3>Il metodo dealloc</h3>
<p>Il metodo <em>dealloc</em> è chiamato quando un oggetto è rimosso dalla memoria. Questo è sicuramente il momento migliore per rilasciare tutte le variabili d&#8217;istanza presenti nella classe:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> dealloc <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>caption release<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>photographer release<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Nelle prime due istruzioni richiamiamo i metodi <em>release</em> delle due variabili. In questo caso possiamo utilizzare <em>release</em> invece che autorelease per quadagnare un po di velocità.</p>
<p>L&#8217;ultima riga è invece molto importante. Questa infatti chiede alla superclasse di effettuare le deallocazioni del caso. Se non chiamiamo questo metodo l&#8217;oggetto non potrà essere rilasciato.</p>
<p>Se è attivo il <em>garbage collector</em> non sarà richiamato il metodo <em>dealloc</em> ma il metodo <em>finalize</em>.</p>
<h3>Ulteriori cenni alla gestione della memoria</h3>
<p>Il sistema di gestione della memoria di <em>Objective-C</em> è basato sul conteggio dei riferimenti agli oggetti.</p>
<p>In parole semplici effettuiamo una <em>alloc</em> su un oggetto, poi probabilmente effettueremo una <em>retain</em> e successivamente una <em>release</em> per ogni chiamata ad <em>alloc</em> o <em>retain</em> effettuata. Quindi se abbiamo effettuato una sola <em>alloc</em> e una sola <em>retain</em> dovremo effettuare due <em>release</em>.</p>
<p>Probabilmente una immagine potrà chiarire il concetto:</p>
<p><img src="http://www.macdev.netsons.org/wp-content/uploads/referencecounting.png" alt="" width="500" height="123" /></p>
<p>Questa è la teoria alla base del reference counting. Nella pratica però ci sono solamente due ragioni per le quali creare un oggetto:</p>
<ol>
<li>Per conservarlo in una variabile d&#8217;istanza</li>
<li>Per usarlo temporaneamente all&#8217;interno di una funzione</li>
</ol>
<p>Nella maggior parte dei casi i setter per una variabile d&#8217;istanza dovrebbero effettuare una release del vecchio oggetto e ritornarne uno nuovo. Bisogna quindi assicurarsi di rilasciarlo in <em>dealloc</em>.</p>
<p>Quindi in conclusione l&#8217;unica cosa che il programmatore deve fare è gestire i riferimenti locali all&#8217;interno delle funzioni. E la regola è questa: se abbiamo creato un oggetto con <em>alloc</em> o <em>copy</em> allora dobbiamo effettuare una <em>release</em> o una <em>autorelease</em> alla fine della funzione, altrimento non c&#8217;è nient&#8217;altro da fare.</p>
<p>Questo è il primo caso:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setTotalAmount<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSNumber</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>input <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>totalAmount autorelease<span style="color: #002200;">&#93;</span>;
    totalAmount <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>input retain<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> dealloc <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>totalAmount release<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Questo è invece il secondo caso:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSNumber</span><span style="color: #002200;">*</span> value1 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNumber</span> alloc<span style="color: #002200;">&#93;</span> initWithFloat<span style="color: #002200;">:</span><span style="color: #2400d9;">8.75</span><span style="color: #002200;">&#93;</span>;
<span style="color: #400080;">NSNumber</span><span style="color: #002200;">*</span> value2 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNumber</span> numberWithFloat<span style="color: #002200;">:</span><span style="color: #2400d9;">14.78</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// rilasciamo solamente value1 e non value2</span>
<span style="color: #002200;">&#91;</span>value1 release<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Ed ecco invece una combinazione dei due casi precedenti:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSNumber</span><span style="color: #002200;">*</span> value1 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNumber</span> alloc<span style="color: #002200;">&#93;</span> initWithFloat<span style="color: #002200;">:</span><span style="color: #2400d9;">8.75</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>self setTotal<span style="color: #002200;">:</span>value1<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #400080;">NSNumber</span><span style="color: #002200;">*</span> value2 <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNumber</span> numberWithFloat<span style="color: #002200;">:</span><span style="color: #2400d9;">14.78</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>self setTotal<span style="color: #002200;">:</span>value2<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #002200;">&#91;</span>value1 release<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Se avete capito questi concetti, avete chiaro il 90% di quello che c&#8217;è da sapere sulla gestione della memoria in <em>Objective-C</em>.</p>
<h3>NSLog</h3>
<p>Loggare messaggi in console con <em>Objective-C</em> è molto semplice. Abbiamo infatti a disposizione la funzione <em>NSLog()</em> che è molto simile alla <em>printf()</em> del c eccetto per il token <em>%@</em> che permette di stampare oggetti.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;The current date and time is: %@&quot;</span>, <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDate</span> date<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;</pre></div></div>

<p>Come accennato prima è possibile stampare degli oggetti. <em>NSLog</em> chiama il metodo description dell&#8217;oggetto e stampa l&#8217;<em>NSString</em> ritornata. Questo metodo può essere anche sovrascritto nelle nostre classi per restituire una stringa personalizzata.</p>
<h3>Le proprietà</h3>
<p>Quando abbiamo scritto i metodi per accedere a <em>caption</em> e <em>author</em> avrete sicuramente notato che il codice usato è ripetitivo e può essere generalizzato.</p>
<p>Le proprietà sono una caratteristica di <em>Objective-C</em> che permette di generare automaticamente i metodi per l&#8217;accesso alle variabili e che forniscono anche altri benefici. Modifichiamo quindi la classe <em>Photo</em> per l&#8217;utilizzo delle proprietà.</p>
<p>Ecco come appariva il codice in precedenza:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import</span>
&nbsp;
<span style="color: #a61390;">@interface</span> Photo <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> caption;
    <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> photographer;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> caption;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> photographer;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setCaption<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>input;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setPhotographer<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>input;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Ed ecco come appare ora:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import</span>
&nbsp;
<span style="color: #a61390;">@interface</span> Photo <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> caption;
    <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> photographer;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>retain<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> caption;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>retain<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> photographer;
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>La direttiva <em>@property</em> dichiara le proprietà. Il retain racchiuso nelle parentesi invece indica che i setter devono restituire il valore in input. Il resto della dichiarazione delle proprietà invece indica il nome e il tipo delle proprietà.</p>
<p>Vediamo invece come dorvà essere scritto il file di implementazione:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;Photo.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> Photo
&nbsp;
<span style="color: #a61390;">@synthesize</span> caption;
<span style="color: #a61390;">@synthesize</span> photographer;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> dealloc <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>caption release<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>photographer release<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>La direttiva <em>@synthesize</em> genera automaticamente getter e setter per noi quindi dovremo solamente implementare il metodo <em>dealloc</em>.</p>
<p>I metodi per l&#8217;accesso alle variabili vengono generati solamente se non sono già esistenti, quindi possiamo anche specificare la direttiva <em>@synthesize</em> per una proprietà, per poi implementarla a mano. Il compilatore completerà l&#8217;implementazione con i soli metodi mancanti.</p>
<p>Ci sono altre opzioni nell&#8217;uso delle proprietà ma non fanno parte dello scopo di questo tutorial.</p>
<h3>L&#8217;oggetto nil</h3>
<p>In <em>Objective-C</em> l&#8217;oggetto <em>nil</em> è l&#8217;ecquivalente di <em>NULL</em> per gli altri linguaggi. La differenza sta nel fatto che su possono chiamare metodi su oggetti nil senza causare crash o sollevare eccezioni.</p>
<p>Questa tecnica è usta nei frameworks in diverse occasioni.</p>
<p>Possiamo anche utilizzarla per migliorare il nostro metodo <em>dealloc</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> dealloc <span style="color: #002200;">&#123;</span>
    self.caption <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
    self.photographer <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;
    <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Questo è possibile perchè quando impostiamo una variabile a <em>nil</em> il setter ritorna come valore <em>nil</em> e rilascia il vecchio valore. Questo approccio a volte è preferibile perchè non c&#8217;è possibilità per la variabile rilasciata di puntare ad un indirizzo casuale che appartiene ad un altro oggetto.</p>
<p>Notate che nel codice precedente viene usato <em>self</em> il che vuol dire che il setter sarà chiamato automaticamente.</p>
<p>Se avessimo scritto il codice in questo modo invece avremmo avuto un errore:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">// sbagliato. provoca una violazione di memoria</span>
<span style="color: #11740a; font-style: italic;">// usate self.caption per passare attraverso il setter</span>
caption <span style="color: #002200;">=</span> <span style="color: #a61390;">nil</span>;</pre></div></div>

<h3>Le categorie</h3>
<p>Le categorie sono una delle funzioni di <em>Objective-C</em> più utili. Essenzialmente una categoria permette di aggiungere metodi ad una classe preesistente senza ereditarla.</p>
<p>Questo è particolarmente utile perchè offre la possibilità di aggiungere metodi ad oggetti compilati. Se ad esempio volessimo aggiungere un metodo ad una istanza della classe <em>NSString</em> possiamo farlo aggiungendo una categoria.</p>
<p>Per esempio supponiamo di voler aggiungere un metodo ad <em>NSString</em> per determinare se contiene un URL. Ecco il codice:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import</span>
&nbsp;
<span style="color: #a61390;">@interface</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">&#40;</span>Utilities<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span> isURL;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Come potete vedere è molto simile alla dichiarazione di una classe. Le differenze sono nel fatto che non c&#8217;è una superclasse e al suo posto c&#8217;è il nome della categoria tra parentesi.</p>
<p>Ecco invece l&#8217;implementazione. Tenete presente però che questo non è il modo migliore per riconoscere un URL! Quello che importa è spiegare il concetto di categoria:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;NSString-Utilities.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">&#40;</span>Utilities<span style="color: #002200;">&#41;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span> isURL <span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>self hasPrefix<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;http://&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">YES</span>;
    <span style="color: #a61390;">else</span>
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">NO</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></div></div>

<p>Ora potremo usare questo metodo su una qualsiasi <em>NSString</em>. Il codice seguente stamperà &#8220;string1 è una stringa&#8221; in console:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> string1 <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;http://pixar.com/&quot;</span>;
<span style="color: #400080;">NSString</span><span style="color: #002200;">*</span> string2 <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Pixar&quot;</span>;
&nbsp;
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>string1 isURL<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
    NSLog <span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;string1 is a URL&quot;</span><span style="color: #002200;">&#41;</span>;
&nbsp;
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#91;</span>string2 isURL<span style="color: #002200;">&#93;</span> <span style="color: #002200;">&#41;</span>
    NSLog <span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;string2 is a URL&quot;</span><span style="color: #002200;">&#41;</span>;</pre></div></div>

<p>A differenza delle sottoclassi, le categorie non possono aggiungere variabili d&#8217;istanza. E&#8217; invece possibile sovrascrivere metodi già esistenti nella classe, anche se questo deve essere fatto con molta attenzione.</p>
<p>Ricordate quando fate delle modifiche ad una classe usando una categoria che queste saranno applicate a tutte le istanze di quella classe nell&#8217;applicazione.</p>
<h3>Conclusioni</h3>
<p>Questa guida è una mia traduzione dell’<a href="http://cocoadevcentral.com/d/learn_objectivec/">articolo originale</a> in lingua inglese.</p>
<img src="http://feeds.feedburner.com/~r/macdev/~4/sSg78WXE1jQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://macdev.netsons.org/guide/imparare-objective-c/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://macdev.netsons.org/guide/imparare-objective-c/</feedburner:origLink></item>
		<item>
		<title>Cocoa e l’uso delle Toolbar</title>
		<link>http://feedproxy.google.com/~r/macdev/~3/gQ6mqsm4vD8/</link>
		<comments>http://macdev.netsons.org/guide/cocoa-e-luso-delle-toolbars/#comments</comments>
		<pubDate>Sun, 04 May 2008 23:21:55 +0000</pubDate>
		<dc:creator>Francesco P.</dc:creator>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[GUI]]></category>

		<guid isPermaLink="false">http://www.macdev.netsons.org/blog/?p=8</guid>
		<description><![CDATA[<h3><strong>Introduzione</strong></h3>
<p>Le toolbar sono ormai presenti nella maggior parte delle applicazioni e offrono la possibilità di effettuare rapidamente le funzioni più utilizzate in una applicazione. In Cocoa la loro implementazione è relativamente facile.</p>
<p><span id="more-8"></span></p>
<h3><strong>Creiamo l&#8217;interfaccia</strong></h3>
<p>Dopo aver creato un progetto di tipo <em>Cocoa&#8230;</em></p>]]></description>
			<content:encoded><![CDATA[<h3><strong>Introduzione</strong></h3>
<p>Le toolbar sono ormai presenti nella maggior parte delle applicazioni e offrono la possibilità di effettuare rapidamente le funzioni più utilizzate in una applicazione. In Cocoa la loro implementazione è relativamente facile.</p>
<p><span id="more-8"></span></p>
<h3><strong>Creiamo l&#8217;interfaccia</strong></h3>
<p>Dopo aver creato un progetto di tipo <em>Cocoa Application</em> apriamo il file <em>MainMenu.nib</em> per editarlo. L&#8217;unica modifica da effettuare sull&#8217;interfaccia grafica consiste nell&#8217;aggiungere due voci di menu che permetteranno di mostrare o nascondere la toolbar e di modificarne i suoi elementi.</p>
<p>Fatto ciò creiamo una classe controller che conterrà un solo <em>IBOutlet</em> per la finestra principale dell&#8217;applicazione. Creiamo quindi l&#8217;<em>IBOutlet</em> che può essere dichiarato staticamente di tipo <em>NSWindow</em> e connettiamolo alla finestra. Ora dovranno essere create due <em>IBAction</em>: una per ognuna delle due voci di menu aggiunte. Una volta create connettiamole alle corrispondenti voci di menu.</p>
<p>L&#8217;ultimo passo da effettuare in <em>Interface Builder</em> è quella di impostare il delegato di <em>File&#8217;s Owner</em>. Per fare ciò, connettiamo <em>File&#8217;s Owner</em> alla classe controller da noi creata.</p>
<p>Questo è tutto quello che va fatto in <em>Interface Builder</em>. A questo punto possiamo esportare la classe controller e tornare ad <em>XCode</em>.</p>
<h3><strong>I delegati</strong></h3>
<p>Quando si aggiunge una toolbar ad un progetto, è necessario implementare dei metodi delegati di <em>NSToolbar</em>. Ci sono tre metodi obbligatori e due opzionali.</p>
<p>I delegati da implementare obbligatoriamente sono:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSToolbarItem</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>toolbar<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSToolbar</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>toolbar itemForItemIdentifier<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>itemIdentifier willBeInsertedIntoToolbar<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>flag
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>toolbarAllowedItemIdentifiers<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSToolbar</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>toolbar
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>toolbarDefaultItemIdentifiers<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSToolbar</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>toolbar</pre></div></div>

<p>Mentre i delegati opzionali sono:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>toolbarWillAddItem<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSNotification</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>notification
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>toolbarDidRemoveItem<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSNotification</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>notification</pre></div></div>

<p>Ma analizziamoli separatamente assieme ad un esempio di implementazione.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSToolbarItem</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>toolbar<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSToolbar</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>toolbar itemForItemIdentifier<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>itemIdentifier willBeInsertedIntoToolbar<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>flag
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>items objectForKey<span style="color: #002200;">:</span>itemIdentifier<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Questo metodo restituisce un <em>NSToolbarItem</em> per l&#8217;identificatore passato in input. L&#8217;item può essere creato nel metodo o come nell&#8217;esempio riportato può essere prelevato da una struttura dati. Questo delegato viene richiamato quando la toolbar viene costruita o quando le viene aggiunto un item.</p>
<p>Dato che gli item della nostra toolbar sono contenuti in un <em>NSDictionary</em> dobbiamo semplicemente restituire l&#8217;item nel dizionario corrispondente all&#8217;identificatore dato in input.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>toolbarAllowedItemIdentifiers<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSToolbar</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>toolbar
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>items allKeys<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Questo metodo restituisce un array che contiene l&#8217;identificatore di ciascun item che è impostato come visibile nella toolbar inclusi i separatori o gli spazi.</p>
<p>Restituiamo un array di chiavi che corrisponde all&#8217;insieme degli item contenuti nel dizionario.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>toolbarDefaultItemIdentifiers<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSToolbar</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>toolbar
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>items allKeys<span style="color: #002200;">&#93;</span> subarrayWithRange<span style="color: #002200;">:</span>NSMakeRange<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>,<span style="color: #2400d9;">6</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Questo metodo restituisce un array di identificatori per gli item che faranno parte del set di default della toolbar. Nel codice di esempio impostiamo i primi sei elementi dell&#8217;array come il set di default.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> toolbarWillAddItem<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSNotification</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> notification
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSToolbarItem</span> <span style="color: #002200;">*</span>addedItem <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>notification userInfo<span style="color: #002200;">&#93;</span> objectForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;item&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// effettuare le operazioni necessarie sull'item</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Questo delegato è chiamato prima che un item venga aggiunto alla toolbar. Dobbiamo quindi usarlo se abbiamo la necessità di effettuare una inizializzazione specifica dell&#8217;item.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>toolbarDidRemoveItem<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSNotification</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>notification
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSToolbarItem</span> <span style="color: #002200;">*</span>addedItem <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>notification userInfo<span style="color: #002200;">&#93;</span> objectForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;item&quot;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #11740a; font-style: italic;">// pulire le informazioni correlate all'item</span>
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Questo delegato è chiamato subito dopo che un item è stato rimosso dalla toolbar. Va quindi usato per rimuovere qualsiasi dato riguardante l&#8217;item e che quindi non è più necessario.</p>
<h3><strong>Mostrare la toolbar</strong></h3>
<p>Ora che abbiamo implementato i delegati dobbiamo creare una istanza della classe <em>NSToolbar</em>. Questo può essere fatto nell&#8217;evento <em>awakeFromNin</em> o in <em>windowControllerDidLoadNib</em> nel caso di una applicazione <em>document based</em>. Siccome però ci troviamo in una applicazione Cocoa dobbiamo collegare l&#8217;istanza della toolbar nel metodo <em>awakeFromNib</em>.</p>
<p>La prima cosa da fare è creare una istanza di <em>NSToolbar</em>. L&#8217;identificatore della toolbar dovrà essere unico perchè tutte le toolbar con uno stesso identificatore saranno sincronizzate nel nostro programma. Quindi quando una toolbar viene personalizzate in una finestra tutte le altre che ne condividono l&#8217;identificatore subiranno le stesse modifiche.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">toolbar <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSToolbar</span> alloc<span style="color: #002200;">&#93;</span> initWithIdentifier<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;tooltest&quot;</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Dopodichè impostiamo alcune proprietà della toolbar:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>toolbar setDelegate<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>toolbar setAllowsUserCustomization<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>toolbar setAutosavesConfiguration<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>La prima proprietà imposta il delegato della toolbar ed indica che i metodi delegati si trovano nella classe controller. Successivamente la toolbar viene impostata come personalizzabile e viene impostato il salvataggio automatico delle modifiche.</p>
<p>Ora dobbiamo collegate la toolbar alla finestra della nostra applicazione:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>window setToolbar<span style="color: #002200;">:</span>toolbar<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Un&#8217;altra proprietà che avremmo potuto impostare è:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setDisplayMode<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSToolbarDisplayMode<span style="color: #002200;">&#41;</span>displayMode</pre></div></div>

<p>che può essere impostata ad uno di questi valori:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">NSToolbarDisplayModeIconAndLabel
NSToolbarDisplayModeIconOnly
NSToolbarDisplayModeLabelOnly</pre></div></div>

<h3><strong>Mostrare e personalizzare la toolbar</strong></h3>
<p>Ci resta da implementare le <em>IBAction</em> che avevamo creato tramite <em>Interface Builder</em> per mostrare o nascondere la toolbar e per poterla personalizzare.</p>
<p>Per visualizzare il pannello di personalizzazione non dobbiamo far altro che chiamare il metodo <em>runCustomizationPalette</em>. Tutto il resto verrà gestito dal framework Cocoa.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>customize<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender
<span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>toolbar runCustomizationPalette<span style="color: #002200;">:</span>sender<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>Per l&#8217;<em>IBAction</em> showhide dobbiamo usare il metodo <em>setVisible:(BOOL)shown</em> che prende in input un booleano che indica se la toolbar dovrà essere mostrata o nascosta. Per passare il giusto valore non dobbiamo far altro che negare il valore restituito dal metodo <em>isVisible</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>showhide<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender
<span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>toolbar setVisible<span style="color: #002200;">:!</span><span style="color: #002200;">&#91;</span>toolbar isVisible<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<h3><strong>Conclusioni</strong></h3>
<p>Come potete vedere aggiungere una toolbar alla nostra applicazione è molto semplice.</p>
<p>Questa guida è una mia traduzione dell&#8217;<a href="http://cocoadevcentral.com/articles/000037.php">articolo originale</a> in lingua inglese.</p>
<h3><strong>Versioni</strong></h3>
<p>05/05/2008 &#8211; Effettuate alcune correzioni grammaticali<br />
05/05/2008 &#8211; Pubblicata la versione iniziale</p>
<img src="http://feeds.feedburner.com/~r/macdev/~4/gQ6mqsm4vD8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://macdev.netsons.org/guide/cocoa-e-luso-delle-toolbars/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://macdev.netsons.org/guide/cocoa-e-luso-delle-toolbars/</feedburner:origLink></item>
		<item>
		<title>NetSocket: un wrapper di CFSocket</title>
		<link>http://feedproxy.google.com/~r/macdev/~3/lbEyQXWr-QM/</link>
		<comments>http://macdev.netsons.org/articoli/netsocket-un-wrapper-di-cfsocket/#comments</comments>
		<pubDate>Sun, 27 Apr 2008 16:29:45 +0000</pubDate>
		<dc:creator>Francesco P.</dc:creator>
				<category><![CDATA[Articoli]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[NetSocket]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Socket]]></category>

		<guid isPermaLink="false">http://www.macdev.netsons.org/blog/?p=3</guid>
		<description><![CDATA[<p>Quasi sempre nello sviluppo di una applicazione si incontra la necessità di utilizzare la rete come strumento. Mi sono quindi posto subito il problema di capire come utilizzare le socket in Cocoa.</p>
<p>Non avendo affatto esperienza in questo ambiente ho prima&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Quasi sempre nello sviluppo di una applicazione si incontra la necessità di utilizzare la rete come strumento. Mi sono quindi posto subito il problema di capire come utilizzare le socket in Cocoa.</p>
<p>Non avendo affatto esperienza in questo ambiente ho prima fatto qualche ricerca sul web, poi ho partecipato a qualche discussione su dei forum e alla fine mi sono trovato davanti ad una scelta: utilizzare le API delle BSD sockets oppure utilizzare dei framework che mi semplificassero il lavoro.</p>
<p>Per ora ho scelto la strada più breve utilizzando un wrapper, NetSocket, che a sua volta si appoggia alla classe CFSocket. In questo modo potrò tralasciare alcuni aspetti della programmazione in rete e concentrarmi sugli altri aspetti dell&#8217;applicazione.</p>
<p>NetSocket ha le seguenti caratteristiche:</p>
<ul class="nav">
<li><strong>Protocolli supportati</strong>: TCP</li>
<li><strong>Buffered I/O</strong>: Si, gestito direttamente dalla classe</li>
<li><strong>I/O Asincrono</strong>: Si, attraverso l&#8217;utilizzo di delegati</li>
<li><strong>Licenza</strong>: BSD</li>
</ul>
<p><a href="http://macdev.netsons.org/wp-content/uploads/netsocket_09.zip">Download NetSocket 0.9</a></p>
<img src="http://feeds.feedburner.com/~r/macdev/~4/lbEyQXWr-QM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://macdev.netsons.org/articoli/netsocket-un-wrapper-di-cfsocket/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://macdev.netsons.org/articoli/netsocket-un-wrapper-di-cfsocket/</feedburner:origLink></item>
	</channel>
</rss>
