<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>netinfluence&#039;s blog &#187; iPhone</title>
	<atom:link href="http://blog.netinfluence.com/tag/iphone/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.netinfluence.com</link>
	<description>le blog de l&#039;agence netinfluence</description>
	<lastBuildDate>Fri, 13 Jan 2012 10:39:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Lomography vs. Faux-Lomography</title>
		<link>http://blog.netinfluence.com/2011/09/29/lomography-vs-faux-lomography/</link>
		<comments>http://blog.netinfluence.com/2011/09/29/lomography-vs-faux-lomography/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 10:00:51 +0000</pubDate>
		<dc:creator>darja</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[conseils]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Lomo LC-A]]></category>
		<category><![CDATA[Lomography]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Photography]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.com/?p=2284</guid>
		<description><![CDATA[Lomography&#8216;s roots go back into late 90s when two Austrian students discover a small russian camera called Lomo LC-A . The camera was cheap, conveniently small, had a great wide angle lens and could take stunning pics in low-light conditions. So there was no hesitation. The fellas took it for a ride  and their only guideline was “Don&#8217;t Think, Just Shoot&#8221;. Today, Lomography stands for an experimental analog film photography and lives through a large international community. Lomography is not a clever idea thought up by a marketing strategist, inventor or artist. Lomography emerged as a consequence of an accidental meeting concerning the technical, economic, social and artistic conditions. And as such had to be developed. &#8230; The art of “junk”, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lomography.com">Lomography</a>&#8216;s roots go back into late 90s when two <a href="http://www.lomography.com/about/timeline">Austrian students</a> discover a small russian camera called <a href="http://microsites.lomography.com/lca+/history">Lomo LC-A</a> . The camera was cheap, conveniently small, had a great wide angle lens and could take stunning pics in low-light conditions. So there was no hesitation. The fellas took it for a ride  and their only guideline was “Don&#8217;t Think, Just Shoot&#8221;.<br />
Today, Lomography stands for an experimental analog film photography and lives through a <a href="http://www.lomography.com/homes/all" target="_blank">large international community</a>.</p>
<p><span id="more-2284"></span></p>
<blockquote><p><em><span style="color: #6c6c6c;">Lomography is not a clever idea thought up by a marketing strategist, inventor or artist. Lomography emerged as a consequence of an accidental meeting concerning the technical, economic, social and artistic conditions. And as such had to be developed.<br />
&#8230; </span></em></p>
<p><em><span style="color: #6c6c6c;">The art of “junk”, the desire to publish, the joy in consumption and in alleged mass numbers (no motif is unworthy of being lomographed), the destruction of traditional practices (seriousness of art, privacy, classical aesthetics of photography etc) are the salt of Lomography, supermarkets are the butter and the LOMO LC-A is the bread.</span></em></p>
<p style="text-align: right;"><em>- a quote from  <a href="http://www.lomography.com/magazine/library/2011/01/07/chapter-3-the-lomography-manifesto" target="_blank">Lomographic Manifesto</a> </em></p>
</blockquote>
<p>Lomo pics can be round, squarish, panoramic, captured in a sequence or in 360°, cross processed, tilt-shifted, bleached by accident, polarized &#8230; And as long as you keep in mind these <a href="http://www.lomography.com/about/the-ten-golden-rules">10 Golden Rules</a>:</p>
<ol>
<li>Take your camera everywhere you go.</li>
<li>Use it any time – day and night.</li>
<li>Lomography is not an interference in your life, but part of it.</li>
<li>Try the shot from the hip.</li>
<li>Approach the objects of your Lomographic desire as close as possible.</li>
<li>Don&#8217;t think (William Firebrace).</li>
<li>Be fast.</li>
<li>You don&#8217;t have to know beforehand what you captured on film.</li>
<li>Afterwards either.</li>
<li>Don&#8217;t worry about any rules.</li>
</ol>
<p>&#8230; you are a Lomographer.</p>
<p>The only inconvenience with lomography is a bunch of different cameras, films, filters you have to carry around.<br />
And if you want to avoid it &#8211; yes, there are Apps for that.</p>
<p>Here is how you can fake your stylish Lomo pics:</p>
<ol>
<li>get your smartphone</li>
<li>install of one of the photo apps as Hipstamatic, Instagram, Lomo Pro&#8230;</li>
<li>and shoot, shoot, shoot.</li>
</ol>
<p><strong>Recommended faux-Lomo apps:</strong></p>
<p><strong><img src="http://blog.netinfluence.com/wp-content/uploads/2010/08/separation.gif" alt="" width="576" height="1" /></strong></p>
<p style="text-align: left;"><a href="http://shop.lomography.com/cameras/lc-a-cameras" target="_blank"><img class="alignnone size-full wp-image-7030" title="Lomo LC-A " src="http://blog.netinfluence.com/wp-content/uploads/2010/08/01-LCA-Lomo.jpg" alt="Lomo LC-A " width="576" height="196" /></a></p>
<p style="text-align: left;"><img class="alignnone size-full wp-image-7040" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/separation.gif" alt="" width="576" height="1" /><a href="http://shop.lomography.com/cameras/medium-format-cameras"><img class="alignnone size-full wp-image-7031" title="Holga Lubitel" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/01-Holga.jpg" alt="Holga Lubitel" width="576" height="196" /></a><img src="http://blog.netinfluence.com/wp-content/uploads/2010/08/separation.gif" alt="" width="576" height="1" /></p>
<p style="text-align: left;"><a href="http://shop.lomography.com/cameras/multilens-cameras" target="_blank"><img class="alignnone size-full wp-image-7032" title="ActionSampler" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/03-ActionSampler.jpg" alt="ActionSampler" width="576" height="305" /></a></p>
<p style="text-align: left;"><img src="http://blog.netinfluence.com/wp-content/uploads/2010/08/separation.gif" alt="" width="576" height="1" /><a href="http://shop.lomography.com/cameras/instant-cameras" target="_blank"><img class="alignnone size-full wp-image-7033" title="Polaroid" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/04-polaroid.jpg" alt="Polaroid" width="576" height="196" /></a><img src="http://blog.netinfluence.com/wp-content/uploads/2010/08/separation.gif" alt="" width="576" height="1" /><a href="http://shop.lomography.com/cameras/pinhole-cameras" target="_blank"><img class="alignnone size-full wp-image-7036" title="Pinhole" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/06-pinhole.jpg" alt="Pinhole" width="576" height="196" /></a><img src="http://blog.netinfluence.com/wp-content/uploads/2010/08/separation.gif" alt="" width="576" height="1" /></p>
<p style="text-align: left;"><a href="http://shop.lomography.com/cameras/panoramic-cameras" target="_blank"><img class="alignnone size-full wp-image-7034" title="Horizon" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/05-360.jpg" alt="Horizon" width="576" height="196" /></a><img src="http://blog.netinfluence.com/wp-content/uploads/2010/08/separation.gif" alt="" width="576" height="1" /></p>
<p style="text-align: left;">
<p style="text-align: left;">Now it&#8217;s up to you if you wanna fake it or keep it true.<br />
Nevertheless&#8230;  your drive should rather be &#8220;don&#8217;t think, just shoot&#8221;.</p>
<p style="text-align: left;"><em>Image used under Creative Commons from <a href="http://www.flickr.com/photos/lauramary/2638959064/" target="_blank">Laura Thorne</a></em></p>
<p style="text-align: left;">
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2011/09/29/lomography-vs-faux-lomography/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Color: l’application sociale mobile de partage de photos</title>
		<link>http://blog.netinfluence.com/2011/03/25/color-lapplication-sociale-mobile-de-partage-de-photos/</link>
		<comments>http://blog.netinfluence.com/2011/03/25/color-lapplication-sociale-mobile-de-partage-de-photos/#comments</comments>
		<pubDate>Fri, 25 Mar 2011 16:40:14 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[reach]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[geolocalisation]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.com/?p=4263</guid>
		<description><![CDATA[Avez-vous entendu parler de Color? C&#8217;est l&#8217;application mobile qui buzz en ce moment sur la toile. L&#8217;aspiration de cette application n&#8217;est autre que de devenir l&#8217;application ultime de découverte localisée. Alors, de quoi s&#8217;agit-il? On pourrait décrire Color comme une application de partage de photos et de vidéos pour un groupe de personnes, de manière publique et géolocalisée. Contrairement à tous les autres réseaux sociaux comme Facebook ou Twitter, Color n&#8217;a pas la même notion d&#8217;amitié. Le partage de photos se fait selon vos habitudes de partage et selon la place où vous vous trouvez. Les vidéos et photos sont publiques, non seulement pour les personnes que vous considérez comme vos amis, mais aussi pour celles, inconnues, qui se trouvent [...]]]></description>
			<content:encoded><![CDATA[<p>Avez-vous entendu parler de <a href="http://color.com/">Color</a>? C&#8217;est l&#8217;application mobile qui buzz en ce moment sur la toile. L&#8217;aspiration de cette application n&#8217;est autre que de devenir l&#8217;application ultime de découverte localisée. Alors, de quoi s&#8217;agit-il?</p>
<p>On pourrait décrire Color comme une application de partage de photos et de vidéos pour un groupe de personnes, de manière publique et géolocalisée. Contrairement à tous les autres réseaux sociaux comme Facebook ou Twitter, Color n&#8217;a pas la même notion d&#8217;amitié. Le partage de photos se fait selon vos habitudes de partage et selon la place où vous vous trouvez. Les vidéos et photos sont publiques, non seulement pour les personnes que vous considérez comme vos amis, mais aussi pour celles, inconnues, qui se trouvent à moins de 35 mètres.</p>
<p><img class="alignnone size-full wp-image-4267" title="color" src="http://blog.netinfluence.com/wp-content/uploads/2011/03/color.jpg" alt="" width="256" height="384" /></p>
<p>Avec Color, vous ne choisissez pas votre réseau d&#8217;amis, c&#8217;est l&#8217;application elle même qui s&#8217;en charge. Comment? Tout simplement en définissant les personnes avec qui vous passez le plus de temps. A chaque fois que vous vous trouvez près de l&#8217;un de vos amis qui utilise Color, l&#8217;application le détecte et classe ainsi vos amitiés. Cependant, si vous ne voyez plus cette personnes pendant quelques temps, elle sera automatiquement déclassée dans vos amitiés Color. Vous pourrez bien entendu gérer ces amitiés, en demandant par exemple d&#8217;en voir plus et plus souvent sur une amitié ou encore de commenter et liker des photos.</p>
<p><img class="alignnone size-full wp-image-4266" title="color2" src="http://blog.netinfluence.com/wp-content/uploads/2011/03/color2.jpg" alt="" width="256" height="384" /></p>
<p>Le coté sympathique de l&#8217;application réside surtout dans le fait de pouvoir voir les photos qui sont prises sur le moment autour de vous, ainsi que celles de vos &#8220;amis&#8221; où qu&#8217;ils soient. Encore plus cool, vous pourrez voir les photos de vos amis, même quelques année plus tard à condition d&#8217;être à l&#8217;endroit précis ou ses photos ont été prises.</p>
<p>Disponible sur iPhone sur Androide, cette application n&#8217;est pas vraiment faite pour les adeptes de la vie privée. Mais qu&#8217;on l&#8217;aime ou pas, Color a déjà réussi à avoir plus de 41 millions $ de financement. Affaire à suivre!</p>
<p><iframe src="http://player.vimeo.com/video/21413899" width="560" height="315" frameborder="0"></iframe>
<p><a href="http://vimeo.com/21413899">Color Demo</a> from <a href="http://vimeo.com/user6387989">Color Labs, Inc.</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2011/03/25/color-lapplication-sociale-mobile-de-partage-de-photos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>De la typographie sur l’iPhone</title>
		<link>http://blog.netinfluence.com/2010/08/15/de-la-typographie-sur-iphone/</link>
		<comments>http://blog.netinfluence.com/2010/08/15/de-la-typographie-sur-iphone/#comments</comments>
		<pubDate>Sun, 15 Aug 2010 18:26:21 +0000</pubDate>
		<dc:creator>mgdh</dc:creator>
				<category><![CDATA[think]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[graphic design]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[type]]></category>
		<category><![CDATA[typo]]></category>
		<category><![CDATA[typography]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.com/?p=2295</guid>
		<description><![CDATA[En tant que designer visuel, je suis passionné de typographie. Et comme beaucoup de mes semblables, j&#8217;ai aussi craqué pour un iPhone&#8230; Résultat: je suis parti à la recherche d&#8217;applications traitant de près ou de loin du sujet de la typo! Voici ci-après 7 iPhone apps que je vous recommande d&#8217;essayer: The typography manual Petit manuel bien ficelé et toujours sous la main sur le sujet: histoire de la typo, les bases, le typesetting, la typo et le web, anatomie des polices, &#8230; Vous trouverez également sous l&#8217;onglet &#8220;Ressources&#8221; quelques outils bien pratique: un calculateur de &#8220;em&#8221;, un tableau des différentes tailles de papier, des sites web, magazines et &#8220;type foundries&#8221; de références, &#8230; (Voir le site &#8211; CHF 4.40) Font [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left">En tant que designer visuel, je suis passionné de typographie. Et comme beaucoup de mes semblables, j&#8217;ai aussi craqué pour un iPhone&#8230; Résultat: je suis parti à la recherche d&#8217;applications traitant de près ou de loin du sujet de la typo!</p>
<p style="text-align: left">Voici ci-après 7 iPhone apps que je vous recommande d&#8217;essayer:</p>
<p style="text-align: left"><a href="http://www.typographyapp.com/" target="_blank"><strong>The typography manual</strong></a></p>
<p style="text-align: left"><a rel="attachment wp-att-2296" href="http://blog.netinfluence.com/2010/08/15/de-la-typographie-sur-iphone/typography/"><img class="aligncenter size-full wp-image-2296" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/typography.jpg" alt="" width="560" height="163" /></a></p>
<p style="text-align: left">Petit manuel bien ficelé et toujours sous la main sur le sujet: histoire de la typo, les bases, le typesetting, la typo et le web, anatomie des polices, &#8230; Vous trouverez également sous l&#8217;onglet &#8220;Ressources&#8221; quelques outils bien pratique: un calculateur de &#8220;em&#8221;, un tableau des différentes tailles de papier, des sites web, magazines et &#8220;type foundries&#8221; de références, &#8230; (<a href="http://www.typographyapp.com/" target="_blank">Voir le site</a> &#8211; CHF 4.40)</p>
<p style="text-align: left"><a href="http://blog.paulchang.com/post/407509901/font-size-calculator-iphone" target="_blank"><strong>Font size calculator</strong></a></p>
<p style="text-align: left"><a rel="attachment wp-att-2305" href="http://blog.netinfluence.com/2010/08/15/de-la-typographie-sur-iphone/fontsize/"><img class="aligncenter size-full wp-image-2305" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/fontsize.jpg" alt="" width="560" height="163" /></a></p>
<p style="text-align: left">Qui ne s&#8217;est jamais demandé si le titre ou texte d&#8217;un poster sera lisible depuis l&#8217;autre côté de la rue? Bien sûre, on peut faire des tests grandeur nature&#8230; compulser ses notes de cours ou entrer quelques valeurs dans l&#8217;interface et voilà&#8230; Pour info, le résultat n&#8217;est qu&#8217;indicatif et l&#8217;oeil du pro tranchera. (<a href="http://blog.paulchang.com/post/407509901/font-size-calculator-iphone" target="_blank">Voir le site</a> &#8211; Gratuit)</p>
<p style="text-align: left"><a href="http://new.myfonts.com/WhatTheFont/iPhone/" target="_blank"><strong>What the font</strong></a></p>
<p style="text-align: left"><a rel="attachment wp-att-2308" href="http://blog.netinfluence.com/2010/08/15/de-la-typographie-sur-iphone/whatthefont/"><img class="aligncenter size-full wp-image-2308" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/whatthefont.jpg" alt="" width="560" height="163" /></a></p>
<p style="text-align: left">La version de &#8220;What the font&#8221; sur l&#8217;internet est déjà une référence et a pu à de nombreuses reprises identifier des polices mystérieuses&#8230; Mais voilà la version mobile! Les posters dans la rue n&#8217;aurons plus de secret! Cette application vous permet d&#8217;identifier des polices utilisées sur tout supports (journaux, magazines, affiches, &#8230;)  Mieux vaut un iPhone 3Gs ou supérieur pour la qualité de la prise de vue. (<a href="http://new.myfonts.com/WhatTheFont/iPhone/" target="_blank">Voir le site</a> &#8211; Gratuit)</p>
<p style="text-align: left"><a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=298268157&amp;mt=8" target="_blank"><strong>Font shuffle</strong></a></p>
<p><a rel="attachment wp-att-2313" href="http://blog.netinfluence.com/2010/08/15/de-la-typographie-sur-iphone/fontshuffle/"><img class="aligncenter size-full wp-image-2313" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/fontshuffle.jpg" alt="" width="560" height="163" /></a>FontShop nous propose avec FontShuffle plus de 650 choix de police: de quoi booster notre inspiration, nous faire découvrir de nouvelles polices, ou redécouvrir de plus anciennes&#8230; Secouez votre iPhone et FontShuffle vous présentera une sélection aléatoire! (<a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=298268157&amp;mt=8">Voir le site</a> &#8211; Gratuit)</p>
<p style="text-align: left"><a href="http://formationalliance.com/index.php?id=39" target="_blank"><strong>KERN</strong></a></p>
<p style="text-align: left"><a rel="attachment wp-att-2321" href="http://blog.netinfluence.com/2010/08/15/de-la-typographie-sur-iphone/kern-2/"><img class="aligncenter size-full wp-image-2321" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/kern1.jpg" alt="" width="560" height="163" /></a>Les expert du &#8220;kerning&#8221; vont apprécier: qui a l&#8217;oeil absolu? Essayez de placer une lettre de 5pt le plus précisément dans un mot en mouvement et dans un temps limité. Dommage que l&#8217;on ne puisse pas partager nos meilleures scores avec d&#8217;autres participants. (<a href="http://formationalliance.com/index.php?id=39" target="_blank">Voir le site</a> &#8211; CHF 1.10)</p>
<p style="text-align: left"><a href="http://fontgameapp.com/" target="_blank"><strong>The Font Game</strong></a></p>
<p style="text-align: left"><a rel="attachment wp-att-2324" href="http://blog.netinfluence.com/2010/08/15/de-la-typographie-sur-iphone/fontgame/"><img class="aligncenter size-full wp-image-2324" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/fontgame.jpg" alt="" width="560" height="163" /></a></p>
<p style="text-align: left">Encore un autre jeu qui mettra votre acuité visuelle et votre expertise en matière de reconnaissance typographique à rude épreuve&#8230; Essayez de reconnaître 657 polices différentes et le plus vite possible, puis publiez vos résultats sur le web! (<a href="http://fontgameapp.com/" target="_blank">Voir le site</a> &#8211; CHF 1.10)</p>
<p style="text-align: left"><a href="http://www.typographykicksass.com/" target="_blank"><strong>Typography kick ass</strong></a></p>
<p style="text-align: left"><a rel="attachment wp-att-2327" href="http://blog.netinfluence.com/2010/08/15/de-la-typographie-sur-iphone/typographykiciass/"><img class="aligncenter size-full wp-image-2327" src="http://blog.netinfluence.com/wp-content/uploads/2010/08/typographykiciass.jpg" alt="" width="560" height="163" /></a>Un petit clin d&#8217;oeil pour cette dernière application: écrivez et envoyez un message composé uniquement de &#8220;lettres photographiques&#8221; provenant de la communauté Flickr. Vous voici l&#8217;auteur d&#8217;un message &#8220;anonyme personnalisé&#8221;. (<a href="http://www.typographykicksass.com/" target="_blank">Voir le site </a>- CHF 1.10)</p>
<blockquote>
<p style="text-align: left">En attendant de tester des applications pour l&#8217;iPad (père Noël?), partagez avec moi vos découvertes&#8230;</p>
</blockquote>
<p style="text-align: left">
<p style="text-align: left">
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2010/08/15/de-la-typographie-sur-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XCode: librairies statiques et catégories</title>
		<link>http://blog.netinfluence.com/2010/06/23/xcode-librairies-statiques-et-categories/</link>
		<comments>http://blog.netinfluence.com/2010/06/23/xcode-librairies-statiques-et-categories/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 14:56:36 +0000</pubDate>
		<dc:creator>macmade</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[conseils]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=1926</guid>
		<description><![CDATA[Il est souvent pratique de scinder un projet XCode en plusieurs parties distinctes: le code permettant de contrôler les différents éléments de l'interface, et le code indépendant de l'interface (outils, librairies, etc).
Une telle découpe présente de nombreux avantage, notamment un meilleur contrôle des options de compilation pour chaque partie ainsi q'un temps de compilation réduit, puisque chaque partie est compilée séparément, et uniquement en cas de besoin.
Cet article explique comment paramétrer un projet XCode pour une telle utilisation.]]></description>
			<content:encoded><![CDATA[<div class="macmade-grey">
<div class="macmade-small"> Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found at: <a href="http://www.gnu.org/copyleft/fdl.html" title="Free Documentation License">http://www.gnu.org/copyleft/fdl.html</a></div>
</div>
<div>
Il est souvent pratique de scinder un projet XCode en plusieurs parties distinctes: le code permettant de contrôler les différents éléments de l&#8217;interface, et le code indépendant de l&#8217;interface (outils, librairies, etc).<br />
Une telle découpe présente de nombreux avantage, notamment un meilleur contrôle des options de compilation pour chaque partie ainsi q&#8217;un temps de compilation réduit, puisque chaque partie est compilée séparément, et uniquement en cas de besoin.<br />
Cet article explique comment paramétrer un projet XCode pour une telle utilisation.
</div>
<h2>Création d&#8217;un projet</h2>
<div>
Nous allons tout d&#8217;abord créer un nouveau projet XCode pour iPhone (la procédure est exactement similaire dans le cas d&#8217;une application Mac OS X).
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-1.png" />
</div>
<div>
XCode crée par défaut les fichiers nécessaires au fonctionnement d&#8217;une application basique.
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-2.png" />
</div>
<div>
La section «Targets» comprend les différents éléments pouvant être produits par notre projet XCode.
</div>
<div>
Dans ce cas là, il s&#8217;agit d&#8217;une application. Ce type de cible est composée de la copie des resources (les fichiers XIB &#8211; interface utilisateur), de la compilation du code source de l&#8217;application, et finalement de la liaison (lainage) du code objet généré avec les librairies et frameworks utilisés par l&#8217;application.
</div>
<div>
Il est possible de définir pour une cible des paramètres de compilation spécifiques, via le menu contextuel,
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-3.png" />
</div>
<h2>Cibles</h2>
<div>
Un projet XCode peut être composé de plusieurs cibles. Cela est nécessaire si l&#8217;on intègre des librairies externes, mais cela peut également être pratique pour séparer un projet et ainsi optimiser la compilation de l&#8217;application finale.
</div>
<div>
Nous allons commencer par créer une nouvelle classe, que nous allons nommer «MethodProvider», dont le but est, comme son nom l&#8217;indique, de mettre à disposition des méthode génériques pour notre application.
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-4.png" />
</div>
<div>
Nous allons y intégrer une méthode statique nommée doSomething.
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-comment">/* MethodProvider.h */</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">&lt;UIKit/UIKit.h&gt;</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@interface</span> MethodProvider: NSObject</code><br />
<code class="macmade-source">{}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">+ ( <span class="macmade-code-keyword">void</span> )doSomething;</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code>
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-comment">/* MethodProvider.m */</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">"MethodProvider.h"</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> MethodProvider</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">+ ( <span class="macmade-code-keyword">void</span> )doSomething</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source">    <span class="macmade-code-predefined">NSLog</span>( <span class="macmade-code-string">@"Method 'doSomething' called..."</span> );</code><br />
<code class="macmade-source">}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code>
</div>
<div>
Nous allons également appeler cette méthode depuis notre application, lorsque celle-ci aura terminé son chargement. Cela se passe dans la méthode «application:didFinishLaunchingWithOptions:»  de la classe «MyAppAppDelegate»:
</div>
<div class="macmade-code">
<code class="macmade-source">- ( <span class="macmade-code-keyword">BOOL</span> )application: ( <span class="macmade-code-predefined">UIApplication</span> * )application didFinishLaunchingWithOptions: ( <span class="macmade-code-predefined">NSDictionary</span> * )launchOptions</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source">    [ <span class="macmade-code-ctag">window</span> <span class="macmade-code-predefined">addSubview</span>: <span class="macmade-code-ctag">viewController</span>.<span class="macmade-code-predefined">view</span> ];</code><br />
<code class="macmade-source">    [ <span class="macmade-code-ctag">window</span> makeKeyAndVisible ];</code><br />
<code class="macmade-source">    </code><br />
<code class="macmade-source">    [ <span class="macmade-code-ctag">MethodProvider</span> doSomething ];</code><br />
<code class="macmade-source">    </code><br />
<code class="macmade-source">    <span class="macmade-code-keyword">return YES</span>;</code><br />
<code class="macmade-source">}</code>
</div>
<div>
Ne pas oublier d&#8217;include le fichier .h de la classe «MethodProvider» dans le fichier «MyAppAppController.m»:
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">"MyAppAppDelegate.h"</span></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">"MyAppViewController.h"</span></code><br />
<code class="macmade-source"><strong><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">"MethodProvider.h"</span></strong></code>
</div>
<div>
Dans ce cas là, la classe «MethodProvider» est compilée avec les autres fichiers sources de notre application. Nous allons maintenant faire en sorte qu&#8217;elle le soit séparément.
</div>
<div>
En premier lieu, nous allons ôter cette classe de la cible de notre application. Cela peut être effectué en décochant la case à côté du fichier source.
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-5.png" />
</div>
<div>
A partir de ce moment là, la classe ne sera plus compilée en même temps que l&#8217;application. La compilation de l&#8217;application va donc échouer avec le message suivant:
</div>
<div>
<pre>
_OBJC_CLASS_$_MethodProvider", referenced from:
objc-class-ref-to-MethodProvider in MyAppAppDelegate.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
</pre>
</div>
<div>
Ce message veut tout simplement dire que le linker n&#8217;a pas réussi à trouver le symbole correspondant à notre classe, alors qu&#8217;il est utilisé depuis la classe MyAppAppDelegate.
</div>
<div>
Nous allons donc créer une nouvelle cible, qui aura pour but de compiler la classe «MethodProvider».
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-6.png" />
</div>
<h2>Librairie statique</h2>
<div>
Cette cible sera de type «static library»:
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-7.png" />
</div>
<div>
Une librairie est un format spécifique de code object (compilé), dont le but est de fournir des fonctions aux applications désirant les utiliser. Une librairie peut être de deux types: statique ou dynamique.
</div>
<div>
Dans le cas d&#8217;une librairie statique, le code objet de la librairie est intégré au binaire de l&#8217;application lors de la compilation.<br />
Il en résulte un seul fichier binaire, contenant à la fois le code de l&#8217;application et le code de la librairie. Le binaire est donc plus lourd, mais la libraire n&#8217;a pas besoin d&#8217;être présente sur la machine hôte.
</div>
<div>
Dans le cas d&#8217;une librairie dynamique, seul son adresse est inclue dans le code de l&#8217;application, et c&#8217;est le kernel (via un linker) qui chargera le code de la libraire en mémoire à chaque fois que l&#8217;application est lancée. Le binaire est dans ce cas plus léger, mais la librairie doit impérativement être présente sur la machine hôte. Le temps de lancement de l&#8217;application peut en outre être un peu plus long. Le principal avantage d&#8217;une librairie dynamique est que plusieurs applications peuvent reposer sur la même librairie.
</div>
<div>
Dans notre cas, c&#8217;est donc bien sûr une libraire statique qu&#8217;il nous faut. Qui plus est, sur iOS, il est actuellement impossible de générer une libraire dynamique.
</div>
<div>
Lorsque plusieurs cibles sont disponibles, XCode permet de passer de l&#8217;une à l&#8217;autre via un menu déroulant, se trouvant dans la barre d&#8217;outils:
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-8.png" />
</div>
<div>
Nous pouvons donc passer sur notre cible «Methods», et y ajouter le(s) fichiers devant être compilés:
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-9.png" />
</div>
<div>
Nous pouvons également voir, au passage, notre librairie dans la section «Products»:
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-10.png" />
</div>
<div>
Il nous reste à lier notre application principale avec cette librairie. Cela est effectué depuis la phase «Link Binary With Libraries» de la cible de l&#8217;application.
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-11.png" />
</div>
<div>
Nous pouvons maintenant y ajouter notre librairie.
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-12.png" />
</div>
<div>
La dernière étape consiste à indiquer à XCode que notre application dépend de la librairie, pour que cette dernière soit compilée avant l&#8217;application, en cas de besoin. Cette opération est effectuée en ajoutant une dépendance, dans la section «General», dans les informations de la cible de l&#8217;application:
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-13.png" />
</div>
<div>
Nous pouvons maintenant compiler notre application sans problème.
</div>
<div>
Cette procédure peut être utilisée, comme dans cet exemple, pour séparer différentes parties de notre code.<br />
C&#8217;est également la procédure à utiliser lors de l&#8217;utilisation de sources et librairies externes, comme par exemple OpenCV (C++), JSON-Framework (Obj-C), etc.<br />
Il est bien sûr possible d&#8217;inclure les fichiers sources dans la même cible que l&#8217;application, mais un tel scénario nous prive de la possibilité de spécifier des paramètres de compilation spécifiques et risque de rallonger inutilement le temps de compilation de la cible principale.
</div>
<h2>Catégories</h2>
<div>
Il faut encore noter que, dans le cas de l&#8217;utilisation de catégories, l&#8217;utilisation d&#8217;une librairie statique peut se révéler problématique.<br />
Pour rappel, en Objective-C, une catégorie permet d&#8217;ajouter des méthodes dans une classe existante.
</div>
<div>
Ajoutons donc une catégorie sur UIApplication, dans la cible de notre librairie:
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-comment">/* MyUIApp.h */</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">&lt;UIKit/UIKit.h&gt;</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@interface</span> UIApplication( MyUIApp )</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )sayHello;</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code>
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-comment">/* MyUIApp.m */</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">"MyUIApp.h"</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> UIApplication( MyUIApp )</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )sayHello</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source">    <span class="macmade-code-predefined">NSLog</span>( <span class="macmade-code-string">@"Hello"</span> );</code><br />
<code class="macmade-source">}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code>
</div>
<div>
Et utilisons cette méthode dans notre application:
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-comment">/* MyAppAppDelegate.m */</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">BOOL</span> )application: ( <span class="macmade-code-predefined">UIApplication</span> * )application didFinishLaunchingWithOptions: ( <span class="macmade-code-predefined">NSDictionary</span> * )launchOptions</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source">    [ <span class="macmade-code-ctag">window</span> <span class="macmade-code-predefined">addSubview</span>: <span class="macmade-code-ctag">viewController</span>.<span class="macmade-code-predefined">view</span> ];</code><br />
<code class="macmade-source">    [ <span class="macmade-code-ctag">window</span> makeKeyAndVisible ];</code><br />
<code class="macmade-source">    </code><br />
<code class="macmade-source">    [ <span class="macmade-code-ctag">MethodProvider</span> doSomething ];</code><br />
<code class="macmade-source">    [ application sayHello ];</code><br />
<code class="macmade-source">    </code><br />
<code class="macmade-source">    <span class="macmade-code-keyword">return YES</span>;</code><br />
<code class="macmade-source">}</code>
</div>
<div>
Sans oublier d&#8217;inclure le fichier header:
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">"MyUIApp.h"</span></code>
</div>
<div>
La compilation se déroulera sans aucun problème, mais l&#8217;application plantera, avec le message suivant (affiché dans la console):
</div>
<div>
<pre>
- [ UIApplication sayHello ]: unrecognized selector sent to instance 0x5911700
</pre>
</div>
<div>
Ce cas particulier est dû au côté dynamique d&#8217;Objective-C (la résolution des méthodes est faite par la couche run-time), est au spécificités du linker, qui ne génère par défaut pas de symboles pour les catégories.
</div>
<div>
Pour régler ce problème, il suffit de modifier les paramètres du linker, dans les informations de la cible de l&#8217;application, et y ajouter, dans la section «Other Linker Flags»:
</div>
<div>
<pre>
-ObjC -all_load
</pre>
</div>
<div>
<img src="/wp-content/uploads/macmade/objc-lib-14.png" />
</div>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2010/06/23/xcode-librairies-statiques-et-categories/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Stickybits: Interactive experience @ netinfluence</title>
		<link>http://blog.netinfluence.com/2010/05/19/stickybits-interactive-experience-netinfluence/</link>
		<comments>http://blog.netinfluence.com/2010/05/19/stickybits-interactive-experience-netinfluence/#comments</comments>
		<pubDate>Wed, 19 May 2010 20:28:22 +0000</pubDate>
		<dc:creator>nicolas</dc:creator>
				<category><![CDATA[reach]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[barcodes]]></category>
		<category><![CDATA[foursquare]]></category>
		<category><![CDATA[Gowalla]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[QR code]]></category>
		<category><![CDATA[StickyBits]]></category>
		<category><![CDATA[SXSW]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=1821</guid>
		<description><![CDATA[Have you heard about stickybits? We got totally hooked on this new start-up since it launched in March during SXSW. What is it and how does it work? After downloading the free StickyBits application on your iPhone or Android, you can start scanning a barcode and upload any kind of digital content or view what others have already uploaded on it. You can scan either barcodes on stickers purchased from StickyBits, or those found on any product out there! To have fun, we sticked StickyBits all over the office. What&#8217;s pretty cool about this is that it creates a unique interactive experience for our visitors! There&#8217;s a StickyBit on your nameplate in the building&#8217;s front entrance so that people who [...]]]></description>
			<content:encoded><![CDATA[<p>Have you heard about <strong><a href="http://stickybits.com" target="_blank">stickybits</a></strong>? We got totally hooked on this new start-up since it launched in March during <a href="http://sxsw.com/" target="_blank">SXSW</a>.</p>
<p>What is it and how does it work? After downloading the free <strong>StickyBits application</strong> on your iPhone or Android, you can start scanning a <strong>barcode</strong> and <strong>upload any kind of digital content</strong> or <strong>view what others have already uploaded on it</strong>. You can scan either barcodes on stickers purchased from StickyBits, or those found on any product out there!</p>
<p>To have fun, we sticked StickyBits all over the office. What&#8217;s pretty cool about this is that <strong>it creates a unique interactive experience for our visitors</strong>! There&#8217;s a StickyBit on your nameplate in the building&#8217;s front entrance so that people who pass-by can discover who we are and what we do, there is one on our office&#8217;s door with a nice video welcome message, there is another one on the wall where we showcase our latest realizations with pictures and links, one in the kitchen area with heaps of fun stuff, and another one in our restroom inviting you to..read our blog! <img src='http://blog.netinfluence.com/wp-content/plugins/smilies-themer/Silk/emoticon_smile.png' alt=':)' class='wp-smiley' /> <br />
The cool part is that all our visitors can &#8220;attach&#8221; their own bits to our stickers. Fun stuff, no?</p>
<p>Beyond this, what blows our minds the most, are all the <strong>possibilities given by this application</strong>. By letting anyone attach a digital message to any physical object, <strong>StickyBits is bridging the gap between real life and digital world</strong>.</p>
<p>Just imagine what it means for brands. Currently all the content appearing on barcodes is user-generated content. But StickyBits plans to release in June <strong>tools for brands, including means to manage the conversations popping up  on its products and an analytics dashboard</strong>. Brands will be able to  track where and when people scan its products, publish official content,  or talk to users that have checked in previously.</p>
<p><a href="http://blog.netinfluence.ch/2010/01/18/foursquare-twitter-geolocalisation/" target="_blank"><strong>Geo-localisation apps</strong></a> like Foursquare or Gowalla, can help brands and retailers get the consumers in the store, but <strong>StickyBits is actually in the store with the consumer when he is making his final purchasing act</strong>! And figures indicate that <strong>30% are using their mobile phones at this exact moment </strong>(to call someone for advice, or look for recommendations online for example).</p>
<p>Therefore it&#8217;s very important, in our opinion, that <strong>brands hurry to take ownership of their product&#8217;s barcode</strong>.<br />
Why? By doing so they can turn a <strong>basic &#8220;product&#8221; into a &#8220;universe&#8221; or &#8220;user experience&#8221;</strong>. Imagine being in a shop, scanning your favorite coffee and getting in return info about its origin, composition, or environmental footprint. But we could also imagine getting more practical outputs like video advice from George Clooney for example, recipe ideas, other consumer&#8217;opinions, discount coupons, or an advertising message.<br />
<strong>There are millions of creative ideas to come up with for brands to give life to their products and deliver a unique experience to consumers</strong>. We are looking forward to help you achieving just that!</p>
<p>Here is a 5 minutes video we made to show you a bit more in details how StickyBits works. Any feedback welcomed!</p>
<p><object width="560" height="450"><param name="movie" value="http://www.youtube.com/v/FjhWBvmayHY&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/FjhWBvmayHY&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="450"></embed></object></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2010/05/19/stickybits-interactive-experience-netinfluence/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Méthodes privées en Objective-C</title>
		<link>http://blog.netinfluence.com/2010/03/04/methodes-privees-en-objective-c/</link>
		<comments>http://blog.netinfluence.com/2010/03/04/methodes-privees-en-objective-c/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 12:44:02 +0000</pubDate>
		<dc:creator>macmade</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=1295</guid>
		<description><![CDATA[En Objective-C, contrairement à de nombreux autres langages orientés objet, le concept de méthode privée n'existe pas en tant que tel. Ce concept peut par contre être implémenté de plusieurs façons. Cet article présente 3 solutions possibles, avec leurs avantages et inconvénients.]]></description>
			<content:encoded><![CDATA[<div class="macmade-grey">
<div class="macmade-small"> Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found at: <a href="http://www.gnu.org/copyleft/fdl.html" title="Free Documentation License">http://www.gnu.org/copyleft/fdl.html</a></div>
</div>
<h2>Introduction</h2>
<div>
En Objective-C, contrairement à de nombreux autres langages orientés objet, le concept de méthode privée n&#8217;existe pas en tant que tel.
</div>
<div>
Dans la déclaration de l&#8217;interface d&#8217;une classe, il est possible de définir une visibilité pour les variables d&#8217;instances.
</div>
<div>
Par exemple:
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-keyword">@interface</span> Foo: NSObject</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@public</span></code><br />
<code class="macmade-source">	</code><br />
<code class="macmade-source">	<span class="macmade-code-keyword">id</span> <span class="macmade-code-ctag">somePublicObject</span>;</code><br />
<code class="macmade-source">	</code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@protected</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">	<span class="macmade-code-keyword">id</span> <span class="macmade-code-ctag">someProtectedObject</span>;</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@private</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">	<span class="macmade-code-keyword">id</span> <span class="macmade-code-ctag">somePrivateObject</span>;</code><br />
<code class="macmade-source">}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">+ ( <span class="macmade-code-keyword">void</span> )someStaticMethod;</code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )someMemberMethod;</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code>
</div>
<div>
Les variables d&#8217;instances peuvent être regroupées en fonction de leur visibilité: publique (accessible depuis l&#8217;extérieur), protégée (accessible depuis la classe et les classes filles), et privée (accessible depuis la classe uniquement).
</div>
<div>
Il n&#8217;existe rien de tel pour les méthodes, au niveau de la déclaration de l&#8217;interface. Cependant, il est parfaitement possible d&#8217;implémenter le concept de méthodes privées, et ce de plusieurs façons.
</div>
<h2>Solution 1 &#8211; Implémentation</h2>
<div>
La première solution, et sans doute la plus évidente, consiste simplement à déclarer des méthodes dans l&#8217;implémentation.<br />
Dans un tel cas, ces méthodes ne seront pas visibles depuis l&#8217;extérieur, étant donné qu&#8217;elles ne sont pas présentes dans l&#8217;interface.
</div>
<div>
Par exemple:
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-keyword">@interface</span> Foo: NSObject</code><br />
<code class="macmade-source">{}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )somePublicMethod;</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> Foo</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )somePrivateMethod</code><br />
<code class="macmade-source">{}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )somePublicMethod</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source">	[ <span class="macmade-code-keyword">self</span> <span class="macmade-code-ctag">somePrivateMethod</span> ];</code><br />
<code class="macmade-source">}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code>
</div>
<div>
Le principal problème avec cette approche est que les méthodes &#8220;privées&#8221; doivent impérativement être déclarées avant le code y faisant référence, sous peine d&#8217;une erreur lors de la compilation.<br />
Dans l&#8217;exemple précédent, nous n&#8217;aurions pas pu déclarer &#8220;somePublicMethod&#8221; avant &#8220;somePrivateMethod&#8221;.<br />
Dans certains cas, lors d&#8217;appels cycliques par exemple, il est tout simplement impossible d&#8217;utiliser cette solution.
</div>
<h2>Solution 2 &#8211; Fonctions statiques</h2>
<div>
Une deuxième solution consiste à l&#8217;utilisation de fonctions statiques.<br />
En langage C, une fonction statique n&#8217;est visible que pour les fonctions se trouvant dans le même fichier.<br />
Il est à noter que, bien que l&#8217;on utilise également dans ce cas le mot clé &#8216;static&#8217;, celui-ci à un tout autre sens que si on l&#8217;utilise pour une variable, à l&#8217;intérieur d&#8217;une fonction.
</div>
<div>
Autrement dit:
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> Foo</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">static void</span> somePrivateFunction( <span class="macmade-code-keyword">void</span> );</code><br />
<code class="macmade-source"><span class="macmade-code-keyword">static void</span> somePrivateFunction( <span class="macmade-code-keyword">void</span> )</code><br />
<code class="macmade-source">{}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )somePublicMethod</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source">	<span class="macmade-code-ctag">somePrivateFunction</span>();</code><br />
<code class="macmade-source">}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code>
</div>
<div>
Il s&#8217;agit d&#8217;une fonction, et non d&#8217;une méthode. Il est par contre possible, depuis cette fonction, d&#8217;accéder aux autres méthodes, et même aux variables d&#8217;instances.<br />
Pour réaliser cela, il suffit de passer l&#8217;instance en paramètre de la fonction:
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> Foo</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">static void</span> somePrivateFunction( Foo * obj );</code><br />
<code class="macmade-source"><span class="macmade-code-keyword">static void</span> somePrivateFunction( Foo * obj )</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source">	/* Appel d'une méthode de la classe */</code><br />
<code class="macmade-source">	[ obj <span class="macmade-code-ctag">someOtherMethod</span> ];</code><br />
<code class="macmade-source">	</code><br />
<code class="macmade-source">	/* Accès à une variable d'instance de la classe */</code><br />
<code class="macmade-source">	obj-><span class="macmade-code-ctag">someInstanceVariable</span> = <span class="macmade-code-keyword">NULL</span>;</code><br />
<code class="macmade-source">}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )somePublicMethod</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source">	<span class="macmade-code-ctag">somePrivateFunction</span>( <span class="macmade-code-keyword">self</span> );</code><br />
<code class="macmade-source">}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code>
</div>
<div>
Une instance d&#8217;une classe est tout simplement (ou presque) un pointeur vers une structure C. L&#8217;opérateur &#8216;->&#8217; peut donc parfaitement être utilisé pour accéder à une variable d&#8217;instance, qui n&#8217;est autre qu&#8217;un membre de cette structure.
</div>
<h2>Solution 3 &#8211; Catégories</h2>
<div>
Une dernière solution, sans doute la plus propre, consiste à utiliser des catégories. Ces dernières sont utilisées pour ajouter des méthodes dans une classe existante.
</div>
<div>
Par exemple:
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-keyword">@interface</span> Foo: NSObject</code><br />
<code class="macmade-source">{}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )somePublicMethod;</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@interface</span> Foo( private )</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )somePrivateMethod;</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> Foo</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> ) somePublicMethod</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source">	[ <span class="macmade-code-keyword">self</span> <span class="macmade-code-ctag">somePrivateMethod</span> ];</code><br />
<code class="macmade-source">}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> Foo( private )</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> ) somePrivateMethod</code><br />
<code class="macmade-source">{}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code>
</div>
<div>
Ici, nous définissons l&#8217;interface de la classe Foo, ainsi qu&#8217;une catégorie nommée &#8220;private&#8221; (ce nom peut être n&#8217;importe lequel).<br />
Nous avons donc ensuite deux implémentations. Une pour les méthodes publiques, et l&#8217;autre pour les privées.<br />
Au niveau des headers, seule l&#8217;interface de base doit être présente, bien évidemment. La déclaration de la catégorie doit se faire dans le fichier contenant l&#8217;implémentation.
</div>
<div>
Il est à noter qu&#8217;il est également possible avec ce système d&#8217;utiliser une seule et unique implémentation. Pour ce faire, il suffit de déclarer une catégorie sans nom:
</div>
<div class="macmade-code">
<code class="macmade-source"><span class="macmade-code-keyword">@interface</span> Foo: NSObject</code><br />
<code class="macmade-source">{}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )somePublicMethod;</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@interface</span> Foo()</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )somePrivateMethod;</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> Foo</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> ) somePublicMethod</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source">	[ <span class="macmade-code-keyword">self</span> <span class="macmade-code-ctag">somePrivateMethod</span> ];</code><br />
<code class="macmade-source">}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> ) somePrivateMethod</code><br />
<code class="macmade-source">{}</code><br />
<code class="macmade-source"></code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@end</span></code>
</div>
<div>
Dès lors, puisque les méthodes privées sont définies dans la catégorie, leur ordre de déclaration dans l&#8217;implémentation n&#8217;a plus aucune importance, contrairement à la première solution présentée ici.
</div>
<h2>Quelle solution choisir?</h2>
<div>
Ces trois solutions fonctionnent très bien. Personnellement, j&#8217;ai tendance à éviter la première, principalement en raison de l&#8217;ordre de déclaration, et aussi parce que les méthodes privées sont difficilement repérables dans le code.<br />
L&#8217;utilisation de catégories permet au code de rester clair et lisible, l&#8217;implémentation des méthodes privées pouvant se faire dans un autre fichier que l&#8217;implémentation des méthodes publiques. Cela permet du coup d&#8217;identifier immédiatement la visibilité d&#8217;une méthode.
</div>
<div>
C&#8217;est donc cette troisième solution que je préconise, est qui certainement la plus adaptée au langage Objective-C.
</div>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2010/03/04/methodes-privees-en-objective-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Le marché des applications iPhone en Suisse c’est de la dynamique!</title>
		<link>http://blog.netinfluence.com/2010/02/18/le-marche-des-applications-iphone-en-suisse-cest-de-la-dynamique/</link>
		<comments>http://blog.netinfluence.com/2010/02/18/le-marche-des-applications-iphone-en-suisse-cest-de-la-dynamique/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 20:01:27 +0000</pubDate>
		<dc:creator>sandrine</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[application iphone]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[itunes]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=937</guid>
		<description><![CDATA[Plus une marque ne peut se passer de son application mobile.  Résultat des courses, la demande pour la création d&#8217;applications iPhone a explosé en 2009. C&#8217;est d&#8217;ailleurs pour en parler que Bilan a réuni les développeurs romands pour un article intitulé : les suisses les rois des applications. Principalement composé de développeurs indépendants, le marché suisse n&#8217;est pas en reste dans la production d&#8217;applications iPhone.  Ayant organisé la premières iPhone  conférence en 2008, Bilan nous a interrogé sur ce qui avait évolué en 2009. De notre point de vue les demandes ont évolué en nombre mais surtout en qualité. Plus habitués et mieux informés, les demandeurs ont compris le besoin de faire une application &#8220;qui sert&#8221; ou &#8220;attire l&#8217;attention&#8221; sous [...]]]></description>
			<content:encoded><![CDATA[<p>Plus une marque ne peut se passer de son application mobile.  Résultat des courses, la demande pour la création d&#8217;applications iPhone a explosé en 2009. C&#8217;est d&#8217;ailleurs pour en parler que Bilan a réuni les développeurs romands pour un article intitulé : <a title="Article de Bilan" href="http://www.bilan.ch/dossier/les-suisses-rois-des-applications">les suisses les rois des applications</a>.</p>
<p>Principalement composé de développeurs indépendants, le marché suisse n&#8217;est pas en reste dans la production d&#8217;applications iPhone.  Ayant organisé la premières iPhone  conférence en 2008, Bilan nous a interrogé sur ce qui avait évolué en 2009.</p>
<p>De notre point de vue les demandes ont évolué en nombre mais surtout en qualité.<br />
Plus habitués et mieux informés, les demandeurs ont compris le besoin de faire une application &#8220;qui sert&#8221; ou &#8220;attire l&#8217;attention&#8221; sous peine de tomber dans l&#8217;abime d&#8217;itunes.  Donc fini les briefs un peu folkloriques et les &#8220;me too&#8221;.<br />
Les demandes sont également beaucoup plus raisonnables en terme de budget.  On ne développe pas une application iPhone en deux jours!  Les coûts sont ceux d&#8217;un site web, voire largement plus dès que l&#8217;on rentre dans des applications complexes comme le jeu.<br />
Enfin, la maturité du marché a soulevé un véritable enthousiasme créatif.  Les demandes que nous recevons ces derniers temps sont vraiment plus réfléchies et créatives.  On ressent une vrai réflexion stratégique donnant une vrai place aux applications mobile dans la stratégie de présence online des entreprises.</p>
<p>Il reste encore beaucoup à découvrir et je me réjoui notamment de développer notre première application iPad <img src='http://blog.netinfluence.com/wp-content/plugins/smilies-themer/Silk/emoticon_wink.png' alt=';-)' class='wp-smiley' /> </p>
<p>Si vous souhaitez en savoir plus ou rejoindre ce microcosme, je vous encourage à aller voir les initiatives suivantes.<br />
De nombreux groupes se sont créés comme &#8220;<a title="Linkedin group" href="http://www.linkedin.com/groups?gid=696197&amp;trk=myg_ugrp_ovr" target="_blank">iphone group for developers &amp; decision makers</a>&#8221; ou &#8220;<a title="Groupe facebook" href="http://www.facebook.com/group.php?gid=39755092833" target="_blank">les développeurs de Suisse romande</a>&#8221; sans oublier les &#8220;<a title="mobile mondays" href="http://www.mobilemonday.ch/" target="_blank">mobile mondays</a>&#8220;.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2010/02/18/le-marche-des-applications-iphone-en-suisse-cest-de-la-dynamique/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mac / iPhone / iPad – Détecter l’inactivité de l’utilisateur avec I/O Kit</title>
		<link>http://blog.netinfluence.com/2010/02/09/mac-iphone-ipad-detecter-linactivite-de-lutilisateur-avec-io-kit/</link>
		<comments>http://blog.netinfluence.com/2010/02/09/mac-iphone-ipad-detecter-linactivite-de-lutilisateur-avec-io-kit/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 16:26:43 +0000</pubDate>
		<dc:creator>macmade</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=855</guid>
		<description><![CDATA[Il peut être parfois utile, dans une application, de savoir si l'utilisateur est en train d'intéragir avec son ordinateur (ou téléphone) ou s'il est parti boire un café.
Cet article explique comment détecter l'inactivité de l'utilisateur. Il s'applique aussi bien au développement pour Mac OS X que pour iPhone / iPad.]]></description>
			<content:encoded><![CDATA[<div class="macmade-grey">
<div class="macmade-small">Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found at: <a title="Free Documentation License" href="http://www.gnu.org/copyleft/fdl.html">http://www.gnu.org/copyleft/fdl.html</a></div>
</div>
<div>Il peut être parfois utile, dans une application, de savoir si l&#8217;utilisateur est en train d&#8217;intéragir avec son ordinateur (ou téléphone) ou s&#8217;il est parti boire un café.<br />
Cet article explique comment détecter l&#8217;inactivité de l&#8217;utilisateur. Il s&#8217;applique aussi bien au développement pour Mac OS X que pour iPhone / iPad.</div>
<h3>I/O Kit</h3>
<div>Il n&#8217;existe à ma connaissance pas de moyen direct, en Cocoa, pour déterminer l&#8217;inactivité.<br />
Par inactivité, il faut comprendre absence d&#8217;interaction de l&#8217;utilisateur avec la machine. L&#8217;interaction peut être le déplacement de la souris, une action sur le clavier, etc, mais non une action déclenchée uniquement par la machine.</div>
<div>Le système dispose bien entendu de cette information. C&#8217;est ce qui permet de déclencher un économiseur d&#8217;écran, ou de mettre la machine en veille.</div>
<div>Pour accéder à cette information, nous allons devoir utiliser I/O Kit.<br />
Il s&#8217;agit d&#8217;une collection de frameworks, librairies et outils destinés principalement au développement de drivers pour des composants matériels.</div>
<div>Dans notre cas, nous allons utiliser plus principalement IOKitLib, une librairie permettant aux applications d&#8217;accéder aux ressources matérielles par le biais du kernel.</div>
<div>Comme il s&#8217;agit d&#8217;une librairie de (relativement) bas niveau, nous allons devoir coder en C pour l&#8217;utiliser.<br />
Nous allons donc, pour des raison pratiques, et pour permettre une utilisation générique, créer une classe Objective-C encapsulant ce code C parfois un peu moins digeste pour certains développeurs Cocoa et iPhone.</div>
<h3>Configuration du projet</h3>
<div>Avant de commencer, nous allons configurer notre projet XCode, afin de permettre l&#8217;utilisation de IOKitLib.<br />
En effet, puisqu&#8217;il s&#8217;agit d&#8217;une librairie, celle-ci doit être «linkée» à notre application finale.</div>
<div>Il suffit d&#8217;ajouter un framework à notre projet:</div>
<div><img src="/wp-content/uploads/macmade/framework-add.png" alt="" width="377" height="267" /></div>
<div>Pour une application Mac OS X, nous allons choisir &#8220;IOKit.framework&#8221;.<br />
Pour iPhone et iPad, ce framework n&#8217;est pas disponible dans son ensemble. Dans un tel cas, il faudra choisir &#8220;libIOKit.dylib&#8221;.</div>
<div><img src="/wp-content/uploads/macmade/framework-list.png" alt="" width="338" height="534" /></div>
<div>Le framework est du coup ajouté à notre projet, et sera «linké» avec notre application après la compilation.</div>
<div><img src="/wp-content/uploads/macmade/framework-cocoa.png" alt="" width="250" height="120" /><br />
<img src="/wp-content/uploads/macmade/framework-iphone.png" alt="" width="250" height="120" /></div>
<h3>Utilisation d&#8217;IOKitLib</h3>
<div>Avant toute chose, voici les documents de références d&#8217;I/O Kit:</div>
<ul>
<li> <a href="http://developer.apple.com/mac/library/documentation/Darwin/Reference/IOKit/IOKitLib_h/">IOKitLib</a></li>
<li> <a href="http://developer.apple.com/mac/library/documentation/DeviceDrivers/Conceptual/AccessingHardware/">Accessing Hardware</a></li>
<li> <a href="http://developer.apple.com/mac/library/documentation/DeviceDrivers/Conceptual/IOKitFundamentals/">I/O Kit Fundamentals</a></li>
</ul>
<div>Nous allons tout d&#8217;abord créer une classe Objective-C qui nous permettra de connaître l&#8217;inactivité:</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-keyword">#include</span> <span class="macmade-code-string">&lt;IOKit/IOKitLib.h&gt;</span></code></p>
<p><code class="macmade-source"><span class="macmade-code-keyword">@interface</span> IdleTime: NSObject</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">mach_port_t</span> <span class="macmade-code-ctag">ioPort</span>;</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">io_iterator_t</span><span class="macmade-code-ctag"> ioIterator</span>;</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">io_object_t</span> <span class="macmade-code-ctag">ioObject</span>;</code><br />
<code class="macmade-source">}</code></p>
<p><code class="macmade-source"><span class="macmade-code-keyword">@property</span>( <span class="macmade-code-keyword">readonly</span> ) <span class="macmade-code-predefined">uint64_t</span> timeIdle;</code><br />
<code class="macmade-source"><span class="macmade-code-keyword">@property</span>( <span class="macmade-code-keyword">readonly</span> ) <span class="macmade-code-predefined">NSUInteger</span> secondsIdle;</code></p>
<p><code class="macmade-source"><span class="macmade-code-keyword">@end</span></code></div>
<div>Cette classe contient 3 variables d&#8217;instances qui nous servirons à communiquer avec I/O Kit.<br />
Les types correspondants à ces variables sont définis dans le fichier &#8220;IOKit/IOKitLib.h&#8221;, que nous incluons.</div>
<div>Nous définissons également deux propriétés, qui nous servirons à accéder au temps inactif. La première en nanosecondes (ce que nous retournera I/O Kit), et la seconde en secondes (ce qui est souvent un peu plus pratique).</div>
<div>Voici l&#8217;implémentation basique de la classe:</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-keyword">#include</span> <span class="macmade-code-string">"IdleTime.h"</span></code></p>
<p><code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> IdleTime</code></p>
<p><code class="macmade-source">- ( <span class="macmade-code-keyword">id</span> )init</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source"> <span class="macmade-code-keyword">if</span>( (<span class="macmade-code-keyword"> self</span> = [ <span class="macmade-code-keyword">super</span> init ] ) ) {</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> }</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> <span class="macmade-code-keyword">return self</span>;</code><br />
<code class="macmade-source">}</code></p>
<p><code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )dealloc</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source"> [ <span class="macmade-code-keyword">super</span> dealloc ];</code><br />
<code class="macmade-source">}</code></p>
<p><code class="macmade-source">- ( <span class="macmade-code-predefined">uint64_t</span> )timeIdle</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source"> <span class="macmade-code-keyword">return</span> 0;</code><br />
<code class="macmade-source">}</code></p>
<p><code class="macmade-source">- ( <span class="macmade-code-predefined">NSUInteger</span> )secondsIdle</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">uint64_t</span> time;</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> time = <span class="macmade-code-keyword">self</span>.<span class="macmade-code-ctag">timeIdle</span>;</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> <span class="macmade-code-keyword">return</span> ( <span class="macmade-code-predefined">NSUInteger</span> )( time &gt;&gt; 30 );</code><br />
<code class="macmade-source">}</code></p>
<p><code class="macmade-source"><span class="macmade-code-keyword">@end</span></code></div>
<div>Nous avons une méthode &#8220;init&#8221;, qui nous servira à établir la communication de base avec I/O Kit, une méthode &#8220;dealloc&#8221; qui nous permettra de libérer les ressources que nous avons alloués, et une méthode (getter) pour chacune de nos propriétés.</div>
<div>La seconde (secondsIdle) ne fait que prendre le temps en nanosecondes et le convertir en secondes. Pour ce faire, il suffit de diviser le temps par 10 puissance 9. Puisque nous avons des valeurs entières, un décalage de 30 sur la droite reviens exactement au même résultat (en plus rapide bien sûr).</div>
<div>Nous allons maintenant nous concentrer sur la méthode &#8220;init&#8221;, et établir une communication avec I/O Kit, qui nous permettra d&#8217;obtenir des informations sur le matériel.</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-keyword">id</span> )init</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">kern_return_t</span> status;</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> <span class="macmade-code-keyword">if</span>( ( <span class="macmade-code-keyword">self</span> = [ <span class="macmade-code-keyword">super</span> init ] ) ) {</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> }</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> <span class="macmade-code-keyword">return self</span>;</code><br />
<code class="macmade-source">}</code></div>
<div>Nous déclarons une variable de type &#8220;kern_status&#8221;, qui nous permettra de connaître le status de la communication avec I/O Kit, afin de gérer d&#8217;éventuelles erreurs.<br />
La suite de code se passe à l&#8217;intérieur de l&#8217;instruction &#8220;if&#8221;:</div>
<div class="macmade-code"><code class="macmade-source">status = <span class="macmade-code-predefined">IOMasterPort</span>( <span class="macmade-code-keyword">MACH_PORT_NULL</span>, &amp;<span class="macmade-code-ctag">ioPort</span> );</code></div>
<div>Ici, nous établissons la connexion avec I/O Kit, sur le port par défaut (MACH_PORT_NULL).</div>
<div>Pour contrôler le résultat de l&#8217;opération, nous pouvons comparer la valeur de &#8220;status&#8221; avec &#8220;KERN_SUCCESS&#8221;:</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-keyword">if</span>( status != <span class="macmade-code-keyword">KERN_SUCCESS</span> ) {</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> <span class="macmade-code-comment">/* Error management... */</span></code><br />
<code class="macmade-source">}</code></div>
<div>I/O Kit se compose de plusieurs services. Celui qui nous intéresse est &#8220;IOHID&#8221; (I/O Human Interface Driver). C&#8217;est celui qui nous permettra de connaître l&#8217;état de l&#8217;interaction entre l&#8217;utilisateur et la machine.<br />
Nous récupérons dans le code suivant un itérateur sur les services I/O Kit, qui nous servira à accéder à IOHID.</div>
<div class="macmade-code"><code class="macmade-source">status = <span class="macmade-code-predefined">IOServiceGetMatchingServices</span>(</code><br />
<code class="macmade-source"> <span class="macmade-code-ctag">ioPort</span>,</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined"> IOServiceMatching</span>( <span class="macmade-code-string">"IOHIDSystem"</span> ),</code><br />
<code class="macmade-source"> &amp;<span class="macmade-code-ctag">ioIterator</span></code><br />
<code class="macmade-source">);</code></div>
<div>Nous pouvons maintenant stocker notre service IOHID:</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-ctag">ioObject</span> = <span class="macmade-code-predefined">IOIteratorNext</span>( <span class="macmade-code-ctag">ioIterator</span> );</code></p>
<p><code class="macmade-source"><span class="macmade-code-keyword">if</span> ( <span class="macmade-code-ctag">ioObject</span> == 0 ) {</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> <span class="macmade-code-comment">/* Error management */</span></code><br />
<code class="macmade-source">}</code></p>
<p><code class="macmade-source"><span class="macmade-code-predefined">IOObjectRetain</span>( <span class="macmade-code-ctag">ioObject</span> );</code><br />
<code class="macmade-source"><span class="macmade-code-predefined">IOObjectRetain</span>( <span class="macmade-code-ctag">ioIterator</span> );</code></div>
<div>Nos effectuons ici un &#8220;retain&#8221;, pour s&#8217;assurer que nos objets ne seront pas désalloués automatiquement.<br />
Il ne faut donc pas oublier d&#8217;effectuer un &#8220;release&#8221; dans la méthode &#8220;dealloc&#8221;:</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )dealloc</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">IOObjectRelease</span>( <span class="macmade-code-ctag">ioObject</span> );</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">IOObjectRelease</span>( <span class="macmade-code-ctag">ioIterator</span> );</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> [ <span class="macmade-code-keyword">super</span> dealloc ];</code><br />
<code class="macmade-source">}</code></div>
<div>Nous avons donc maintenant établi la communication avec I/O Kit, et obtenu un accès au service IOHID.<br />
Il ne nous reste plus qu&#8217;à interroger ce service, dans la méthode &#8220;timeIdle&#8221;.</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-predefined">uint64_t</span> )timeIdle</code><br />
<code class="macmade-source">{</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">kern_return_t</span> status;</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">CFTypeRef</span> idle;</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">CFTypeID</span> type;</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">uint64_t</span> time;</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">CFMutableDictionaryRef</span> properties;</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> properties = <span class="macmade-code-keyword">NULL</span>;</code></div>
<div>Nous déclarons ici les différentes variables que nous allons utiliser.</div>
<div>Nous allons en premier lieu récupérer les propriétés de IOHID.</div>
<div class="macmade-code"><code class="macmade-source">status = <span class="macmade-code-predefined">IORegistryEntryCreateCFProperties</span>(</code><br />
<code class="macmade-source"> <span class="macmade-code-ctag">ioObject</span>,</code><br />
<code class="macmade-source"> &amp;properties,</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">kCFAllocatorDefault</span>,</code><br />
<code class="macmade-source"> 0</code><br />
<code class="macmade-source">);</code></div>
<div>Nous récupérons ici dans notre variable &#8220;properties&#8221; un dictionnaire, comparable à l&#8217;objet &#8220;NSDictionnary&#8221;.<br />
Nous récupérons également toujours un status du kernel, qu&#8217;il nous faut vérifier comme précédemment.</div>
<div>Nous pouvons donc désormais obtenir un propriété de IOHID. Celle qui nous intéresse se nomme &#8220;HIDIdleTime&#8221;:</div>
<div class="macmade-code"><code class="macmade-source">idle = <span class="macmade-code-predefined">CFDictionaryGetValue</span>( properties, <span class="macmade-code-keyword">CFSTR</span>( <span class="macmade-code-string">"HIDIdleTime"</span> ) );</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"><span class="macmade-code-keyword">if</span>( !idle ) {</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">CFRelease</span>( ( <span class="macmade-code-predefined">CFTypeRef</span> )properties );</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> <span class="macmade-code-comment">/* Error management */</span></code><br />
<code class="macmade-source">}</code></div>
<div>En cas d&#8217;erreur, il ne faut pas oublier de releaser l&#8217;objet &#8220;properties&#8221;, afin d&#8217;éviter un memory leak.</div>
<div>Un dictionnaire peut contenir plusieurs types de valeurs. Nous devons donc connaître le type de la propriété &#8220;HIDIdleTime&#8221; avant de la traiter.</div>
<div class="macmade-code"><code class="macmade-source">type = <span class="macmade-code-predefined">CFGetTypeID</span>( idle );</code></div>
<div>La propriété peut être de type &#8220;number&#8221; ou &#8220;data&#8221;. Pour obtenir la valeur correcte, chaque cas doit être pris en compte.</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-keyword">if</span>( type == <span class="macmade-code-predefined">CFDataGetTypeID()</span> ) {</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">CFDataGetBytes</span>( ( <span class="macmade-code-predefined">CFDataRef</span> )idle, <span class="macmade-code-predefined">CFRangeMake</span>( 0, <span class="macmade-code-keyword">sizeof</span>( time ) ), ( <span class="macmade-code-predefined">UInt8</span> * )&amp;time );</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source">} <span class="macmade-code-keyword">else if</span>( type == <span class="macmade-code-predefined">CFNumberGetTypeID()</span> ) {</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">CFNumberGetValue</span>( ( <span class="macmade-code-predefined">CFNumberRef</span> )idle, <span class="macmade-code-predefined">kCFNumberSInt64Type</span>, &amp;time );</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source">} <span class="macmade-code-keyword">else</span> {</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">CFRelease</span>( idle );</code><br />
<code class="macmade-source"> <span class="macmade-code-predefined">CFRelease</span>( ( <span class="macmade-code-predefined">CFTypeRef</span> )properties );</code><br />
<code class="macmade-source"> </code><br />
<code class="macmade-source"> <span class="macmade-code-comment">/* Error management */</span></code><br />
<code class="macmade-source">}</code></div>
<div>Il ne reste plus qu&#8217;à releaser nos objets, et à retourner la valeur:</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-predefined">CFRelease</span>( idle );</code><br />
<code class="macmade-source"><span class="macmade-code-predefined">CFRelease</span>( ( <span class="macmade-code-predefined">CFTypeRef</span> )properties );</code></p>
<p><code class="macmade-source"><span class="macmade-code-keyword">return</span> time;</code></div>
<div>La classe est terminée. Pour l&#8217;utiliser, il suffit de l&#8217;instancier et de consulter sa propriété &#8220;secondsIdle&#8221; (depuis un timer par exemple).</div>
<h3>Demo</h3>
<div>Voici un exemple de programme utilisant cette classe pour afficher l&#8217;inactivité:</div>
<div><a href="/wp-content/uploads/macmade/idle.m">idle.m</a></div>
<div>Pour le compiler et l&#8217;executer:</div>
<div class="macmade-code"><code class="macmade-source">gcc -Wall -framework Cocoa -framework IOKit -o idle idle.m &amp;&amp; ./idle</code></div>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2010/02/09/mac-iphone-ipad-detecter-linactivite-de-lutilisateur-avec-io-kit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Quel produit sera présenté le 27 Janvier ?</title>
		<link>http://blog.netinfluence.com/2010/01/20/quel-produit-sera-presente-le-27-janvier/</link>
		<comments>http://blog.netinfluence.com/2010/01/20/quel-produit-sera-presente-le-27-janvier/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 23:32:59 +0000</pubDate>
		<dc:creator>jean</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iSlate]]></category>
		<category><![CDATA[keynote]]></category>
		<category><![CDATA[tablette]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=773</guid>
		<description><![CDATA[Le 27 Janvier prochain, Apple va présenter un nouveau produit lors de sa keynote. A priori, le buzz du moment est la future tablette, iSlate ou autre nom, vous ne pouvez pas y avoir échappé. Pour ma part, je me souviens de la keynote d&#8217;il y a 3 ans, où a été présenté l&#8217;iphone pour la première fois, et la révolution que cela a entrainée. Sommes nous à l&#8217;aube d&#8217;une autre révolution ? Je l&#8217;espère, et attends avec impatience de découvrir ce qui va nous être présenté. Je pari sur une tablette, avec webcam intégré, 3G, un Kindle sauce Apple, mais communiquant. Le compagnon parfait de mon ordinateur. En souvenir, l&#8217;image que je retiens de la keynote 2007, que vous [...]]]></description>
			<content:encoded><![CDATA[<p>Le 27 Janvier prochain, Apple va présenter un nouveau produit lors de sa keynote. A priori, le buzz du moment est la future tablette, iSlate ou autre nom, vous ne pouvez pas y avoir échappé.</p>
<p>Pour ma part, je me souviens de la keynote d&#8217;il y a 3 ans, où a été présenté l&#8217;iphone pour la première fois, et la révolution que cela a entrainée. Sommes nous à l&#8217;aube d&#8217;une autre révolution ? Je l&#8217;espère, et attends avec impatience de découvrir ce qui va nous être présenté.</p>
<p>Je pari sur une tablette, avec webcam intégré, 3G, un Kindle sauce Apple, mais communiquant. Le compagnon parfait de mon ordinateur.</p>
<p>En souvenir, l&#8217;image que je retiens de la keynote 2007, que vous pouvez retrouver ici : <a title="Keynote 2007" href="http://www.apple.com/quicktime/qtv/mwsf07/" target="_blank">http://www.apple.com/quicktime/qtv/mwsf07/</a></p>
<p>Plus que quelques jours à attendre&#8230;.</p>
<p><img class="alignleft size-medium wp-image-775" title="Capture d’écran 2010-01-20 à 00.14.27" src="http://blog.netinfluence.ch/wp-content/uploads/2010/01/Capture-d’écran-2010-01-20-à-00.14.27-300x184.png" alt="" width="300" height="184" /></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2010/01/20/quel-produit-sera-presente-le-27-janvier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VIDEO ITW – What are the next cool things for conversation?</title>
		<link>http://blog.netinfluence.com/2009/12/08/what-are-the-next-cool-things-for-conversation/</link>
		<comments>http://blog.netinfluence.com/2009/12/08/what-are-the-next-cool-things-for-conversation/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 09:10:53 +0000</pubDate>
		<dc:creator>netinfluence</dc:creator>
				<category><![CDATA[grow]]></category>
		<category><![CDATA[blogger]]></category>
		<category><![CDATA[blogs]]></category>
		<category><![CDATA[conversation]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[kindle]]></category>
		<category><![CDATA[Loic Le Meur]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[seesmic]]></category>
		<category><![CDATA[social media]]></category>
		<category><![CDATA[thwirl]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=254</guid>
		<description><![CDATA[This article was originally created by Marie Girardet (Left our team) The difference between the US and europe, in terms of technology adoption, is less and less the time.  We used to have to wait years to get access to new stuff.  This is less and less the case. Thanks to the internet which eliminated boundaries &#38; distances, we are shiffting toward a &#8220;real-time conversations area&#8221;. And the mobile development as allowed for a vast potential for future applications.  Blogs used to be conversations as once stated Loic Le Meur.  Now conversation is everywhere, anytime, and live. Loic has shared his vision on how he was seeing conversations evolving , and we want to share it with you too Following [...]]]></description>
			<content:encoded><![CDATA[<p style="color: #999999; border-bottom: solid 1px #EFEFEF; margin-bottom: 20px; padding-bottom: 20px;">This article was originally created by Marie Girardet (Left our team)</p>
<p>The difference between the US and europe, in terms of technology adoption, is less and less the time.  We used to have to wait years to get access to new stuff.  This is less and less the case.</p>
<p>Thanks to the internet which eliminated boundaries &amp; distances, we are shiffting toward a &#8220;real-time conversations area&#8221;. And the mobile development as allowed for a vast potential for future applications.  Blogs used to be conversations as once stated <a title="lien vers twitter de loic le meur" href="http://twitter.com/loic" target="_self">Loic Le Meur</a>.  Now conversation is everywhere, anytime, and live.<br />
<a href="http://www.seesmic.com" target="_self"> Loic</a> has shared his vision on how he was seeing conversations evolving , and we want to share it with you too <img src='http://blog.netinfluence.com/wp-content/plugins/smilies-themer/Silk/emoticon_wink.png' alt=';-)' class='wp-smiley' /> </p>
<object type="application/x-shockwave-flash" style="width:425px; height:355px;" data="http://www.youtube.com/v/VLomBCNyJas&amp;rel=1&amp;color1=0xd6d6d6&amp;color2=0xf0f0f0&amp;autoplay=1"><param name="movie" value="http://www.youtube.com/v/VLomBCNyJas&amp;rel=1&amp;color1=0xd6d6d6&amp;color2=0xf0f0f0&amp;autoplay=1" /></object>
<p>Following<a title="leweb compte twitter" href="http://www.twitter.com/leweb" target="_self"> leWeb</a>, whether online or live, if you are in paris, is a must.</p>
<p>For those of you developing businesses or online strategies, this is the &#8220;must be&#8221; area, every year.  Check their <a href="http://www.leweb.net/">website</a>, <a href="http://www.leweb.net/register">subscribe</a> or follow the ustream feed.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/12/08/what-are-the-next-cool-things-for-conversation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Closure et fonctions lambda en Objective-C</title>
		<link>http://blog.netinfluence.com/2009/11/12/closure-et-fonctions-lambda-en-objective-c/</link>
		<comments>http://blog.netinfluence.com/2009/11/12/closure-et-fonctions-lambda-en-objective-c/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 22:02:00 +0000</pubDate>
		<dc:creator>macmade</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[avant-garde]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[communauté]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[méthodes]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=55</guid>
		<description><![CDATA[De nombreux langages de scripts permettent l'utilisation de «fonctions lambdas», ou encore «fonctions anonymes», concept généralement lié au phénomène appelé «closure».<br />
 Il s'agit de concepts bien connus notamment en JavaScript, ActionScript, ou encore en PHP depuis sa version 5.3.<br />
 Le langage Objective-C offre depuis peu une implémentation de ces deux concepts, appelée «blocks».<br />
 Les blocks sont disponibles depuis Mac OS X 10.6 et l'adoption de Clang.]]></description>
			<content:encoded><![CDATA[<div class="macmade-grey">
<div class="macmade-small"> Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found at: <a href="http://www.gnu.org/copyleft/fdl.html" title="Free Documentation License">http://www.gnu.org/copyleft/fdl.html</a></div>
</div>
<h3>Définitions</h3>
<div>
De nombreux langages de scripts permettent l&#8217;utilisation de «fonctions lambdas», ou encore «fonctions anonymes», concept généralement lié au phénomène appelé «closure».<br />
 Il s&#8217;agit de concepts bien connus notamment en JavaScript, ActionScript, ou encore en PHP depuis sa version 5.3.<br />
 Le langage Objective-C offre depuis peu une implémentation de ces deux concepts, appelée «blocks».<br />
 Les blocks sont disponibles depuis Mac OS X 10.6 et l&#8217;adoption de Clang.
</div>
<p><span id="more-55"></span></p>
<h4>Fonctions anonymes</h4>
<div> Comme son nom l&#8217;indique, une fonction anonyme est une fonction ne possédant pas de nom, ou d&#8217;identifiant. Elle ne contient que son contenu (body), et peut être associée à une variable, pour être ré-utilisée, ou passée en argument d&#8217;une autre fonction. </div>
<div> Ce phénomène est très souvent utilisé dans des langages de scripts, notamment pour des callbacks. </div>
<div> En JavaScript par exemple, imaginons une fonction standard nommée «foo», prenant en paramètre un callback, et l&#8217;exécutant dans son body: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">function</span> foo( callback )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    callback();</code><br />
 <code class="macmade-source">}</code> </div>
<div> Il est parfaitement possible de définir une autre fonction standard, et de la passer en paramètre de notre première fonction: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">function</span> bar()</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    alert( <span class="macmade-code-string">'Hello World!'</span> );</code><br />
 <code class="macmade-source">}</code></p>
<p> <code class="macmade-source">foo( bar );</code> </div>
<div> Le problème dans un tel cas est que nous déclarons une fonction nommée «bar» dans le scope global. Il en découle un risque de collision avec une éventuelle autre fonction qui porterait le même nom. </div>
<div> Le langage JavaScript nous permet donc de déclarer la fonction utilisée comme callback lors de l&#8217;appel: </div>
<div class="macmade-code"> <code class="macmade-source">foo(</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">function</span>()</code><br />
 <code class="macmade-source">    {</code><br />
 <code class="macmade-source">        alert( <span class="macmade-code-string">'Hello World!'</span> );</code><br />
 <code class="macmade-source">    }</code><br />
 <code class="macmade-source">);</code> </div>
<div> Notre callback n&#8217;a ici pas d&#8217;identifiant. Il n&#8217;existera pas dans le scope global, et donc ne risquera pas d&#8217;entrer en conflit avec une fonction existante. </div>
<div> Il est également possible de définir le callback comme variable. Il n&#8217;existera toujours pas dans le scope global, mais pourra ainsi être ré-utilisé à volonté via cette variable: </div>
<div class="macmade-code"> <code class="macmade-source">myCallback = <span class="macmade-code-keyword">function</span>()</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    alert( <span class="macmade-code-string">'Hello World!'</span> );</code><br />
 <code class="macmade-source">};</code></p>
<p> <code class="macmade-source">foo( myCallback );</code> </div>
<h4>Closure</h4>
<div> Le phénomène appelé «closure» consiste en la possibilité, pour une fonction, d&#8217;accéder aux variables disponibles dans son contexte de déclaration, ceci même dans le cas où son contexte d&#8217;exécution est différent. </div>
<div> Toujours en JavaScript, imaginons le code suivant: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">function</span> foo( callback )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    alert( callback() );</code><br />
 <code class="macmade-source">}</code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">function</span> bar()</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">var</span> str = <span class="macmade-code-string">'Hello World'</span>;</code></p>
<p> <code class="macmade-source">    foo(</code><br />
 <code class="macmade-source">        <span class="macmade-code-keyword">function</span>()</code><br />
 <code class="macmade-source">        {</code><br />
 <code class="macmade-source">            <span class="macmade-code-keyword">return</span> str;</code><br />
 <code class="macmade-source">        }</code><br />
 <code class="macmade-source">    );</code><br />
 <code class="macmade-source">}</code></p>
<p> <code class="macmade-source">bar();</code> </div>
<div> Notre callback, passé à la fonction «foo» depuis le contexte d&#8217;exécution de le fonction «bar» retourne une variable nommée «str».<br />
 Or, cette variable, déclarée dans le contexte de la fonction «bar», est une variable locale à cette dernière. Autrement dit, elle n&#8217;existe qu&#8217;à l&#8217;intérieur de ce contexte.<br />
 Comme notre callback est exécuté depuis un contexte différent du contexte de la déclaration de cette variable, on pourrait penser que le code-ci dessus n&#8217;affiche rien.<br />
 Mais c&#8217;est ici que le phénomène de closure intervient.<br />
 Quel que soit son contexte d&#8217;exécution, une fonction conserve un accès aux variables disponibles lors de sa déclaration. </div>
<div> Notre callback aura donc bien accès à la variable «str», même s&#8217;il est effectivement appelé depuis la fonction «foo», et que cette dernière n&#8217;y a pas accès. </div>
<h3>Implémentation en Objective-C</h3>
<div> Objective-C implémente ce genre de concepts, même s&#8217;il existe un certain nombre de subtilités, venant du fait qu&#8217;il s&#8217;agit d&#8217;un langage compilé dérivé du C, en restant très proche, donc très différent d&#8217;un langage de script interprété. </div>
<div> Il est à noter que le support des blocks est aussi disponible en C pur, ou en C++ (et donc en Objective-C++). </div>
<div> De même qu&#8217;une fonction standard en C, la déclaration d&#8217;un block (fonction anonyme) se doit d&#8217;être précédée par la déclaration de son prototype. </div>
<div> La syntaxe de déclaration d&#8217;un block n&#8217;est pas la plus évidente, mais on s&#8217;y fait relativement vite.<br />
 Voici par exemple le prototype d&#8217;un block: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-predefined">NSString</span> * ( ^myBlock )( <span class="macmade-code-keyword">int</span> );</code> </div>
<div> Nous déclarons ici le prototype d&#8217;un block («^»), destiné à être nommé «myBlock», prenant un argument unique de type «int», et retournant un pointeur sur un objet de type «NSString». </div>
<div> Nous pouvons maintenant déclarer le block: </div>
<div class="macmade-code"> <code class="macmade-source">myBlock = ^( <span class="macmade-code-keyword">int</span> number )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">return</span> [ <span class="macmade-code-predefined">NSString stringWithFormat</span>: <span class="macmade-code-string">@"Passed number: %i"</span>, number ];</code><br />
 <code class="macmade-source">};</code> </div>
<div> Nous assignons donc à la variable «myBlock» le body d&#8217;une fonction, prenant comme argument «number» un entier. Cette fonction retourne un objet «NSString», dans lequel sera affiché cet entier. </div>
<div> <strong>Attention, ne pas oublier le point virgule à la fin de la déclaration du block!</strong> </div>
<div> Si cela est facultatif dans des langages de scripts, c&#8217;est absolument nécessaire pour un langage compilé comme Objective-C.<br />
 L&#8217;oublier résulterait en une erreur du compilateur, qui refuserait de générer l&#8217;exécutable final. </div>
<div> Le block peut désormais être utilisé, comme une fonction standard: </div>
<div class="macmade-code"> <code class="macmade-source">myBlock();</code> </div>
<div> Voici le code complet d&#8217;un programme Objective-C, reprenant l&#8217;exemple précédent: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">&lt;Cocoa/Cocoa.h&gt;</span></code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">int</span> main( <span class="macmade-code-keyword">void</span> )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSAutoreleasePool</span> * pool;</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSString</span>          * ( ^myBlock )( <span class="macmade-code-keyword">int</span> );</code></p>
<p> <code class="macmade-source">    pool    = [ [ <span class="macmade-code-predefined">NSAutoreleasePool</span> alloc ] init ];</code><br />
 <code class="macmade-source">    myBlock = ^( <span class="macmade-code-keyword">int</span> number )</code><br />
 <code class="macmade-source">    {</code><br />
 <code class="macmade-source">        <span class="macmade-code-keyword">return</span> [ <span class="macmade-code-predefined">NSString stringWithFormat</span>: <span class="macmade-code-string">@"Passed number: %i"</span>, number ];</code><br />
 <code class="macmade-source">    };</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-predefined">NSLog</span>( <span class="macmade-code-string">@"%@"</span>, myBlock() );</code></p>
<p> <code class="macmade-source">    [ pool release ];</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">return</span> EXIT_SUCCESS;</code><br />
 <code class="macmade-source">}</code> </div>
<div> Un tel programme peut être compilé à l&#8217;aide de la commande suivante (Terminal): </div>
<div class="macmade-code"> <code class="macmade-source">gcc -Wall -framework Cocoa -o test test.m</code> </div>
<div> Cela générera un fichier exécutable nommé «test», à partir du fichier source «test.m».<br />
 Pour lancer l&#8217;exécutable: </div>
<div class="macmade-code"> <code class="macmade-source">./test</code> </div>
<div> La déclaration du prototype d&#8217;un block peut être omise dans le cas où le block n&#8217;est pas assigné à une variable, comme par exemple s&#8217;il est transmis directement comme argument. </div>
<div> Par exemple: </div>
<div class="macmade-code"> <code class="macmade-source">someFunction( ^ <span class="macmade-code-predefined">NSString</span> * ( <span class="macmade-code-keyword">void</span> ) { <span class="macmade-code-keyword">return</span> <span class="macmade-code-string">@"Hello World!"</span> } );</code> </div>
<div> Il est à noter que dans un tel cas, le type de retour doit être déclaré. Ici, il s&#8217;agit d&#8217;un objet de type «NSString». </div>
<h4>Passage d&#8217;un block comme argument</h4>
<div> Un block peut bien sûr être passé comme argument d&#8217;une fonction C.<br />
 Là aussi, la syntaxe peut être quelque peu déroutante à première vue: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">void</span> logBlock( <span class="macmade-code-predefined">NSString</span> * ( ^theBlock )( <span class="macmade-code-keyword">int</span> ) )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSLog</span>( <span class="macmade-code-string">@"Block returned: %@"</span>, theBlock() );</code><br />
 <code class="macmade-source">}</code> </div>
<div> Evidemment, comme Objective-C est un langage fortement typé, une fonction recevant un block en argument doit également déclarer son type de retour et le type de ses éventuels arguments. </div>
<div> Il en va de même dans le cas d&#8217;une méthode d&#8217;une classe Objective-C: </div>
<div class="macmade-code"> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )logBlock: ( <span class="macmade-code-predefined">NSString</span> * ( ^ )( <span class="macmade-code-keyword">int</span> ) )theBlock;</code> </div>
<h4>Closure</h4>
<div> Le phénomène de closure est également présent en Objective-C, même si son comportement est évidemment différent de celui des langages interprétés. </div>
<div> Imaginons le programme suivant: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">&lt;Cocoa/Cocoa.h&gt;</span></code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">void</span> logBlock( <span class="macmade-code-keyword">int</span> ( ^theBlock )( <span class="macmade-code-keyword">void</span> ) )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSLog</span>( <span class="macmade-code-string">@"Closure var X: %i"</span>, theBlock() );</code><br />
 <code class="macmade-source">}</code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">int</span> main( <span class="macmade-code-keyword">void</span> )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSAutoreleasePool</span> * pool;</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">int</span> ( ^myBlock )( <span class="macmade-code-keyword">void</span> );</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">int</span> x;</code></p>
<p> <code class="macmade-source">    pool = [ [ <span class="macmade-code-predefined">NSAutoreleasePool</span> alloc ] init ];</code><br />
 <code class="macmade-source">    x    = 27;</code></p>
<p> <code class="macmade-source">    myBlock = ^( <span class="macmade-code-keyword">void</span> )</code><br />
 <code class="macmade-source">    {</code><br />
 <code class="macmade-source">        <span class="macmade-code-keyword">return</span> x;</code><br />
 <code class="macmade-source">    };</code></p>
<p> <code class="macmade-source">    logBlock( myBlock );</code></p>
<p> <code class="macmade-source">    [ pool release ];</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">return</span> EXIT_SUCCESS;</code><br />
 <code class="macmade-source">}</code> </div>
<div> La fonction «main» déclare un entier, de valeur 27, ainsi qu&#8217;un block, retournant cette même variable.<br />
 Le block set ensuite passé à la fonction «logBlock», qui affiche sa valeur de retour. </div>
<div> Même dans le contexte d&#8217;exécution de la fonction «logBlock», le block déclaré dans la fonction «main» continue d&#8217;avoir accès à l&#8217;entier «x», et peut donc sans aucun problème en retourner la valeur. </div>
<div> Il est à noter que les blocks ont également accès aux variable globales, même statiques si elles sont disponibles dans le contexte du block. </div>
<div> Il existe ici une première subtilité. En effet, les variables disponibles depuis un block par le phénomène de closure sont de type «const». Autrement dit, elle ne peuvent être modifiées depuis l&#8217;intérieur du block. </div>
<div> Par exemple, imaginons que notre block incrémente la valeur de x avant de la retourner: </div>
<div class="macmade-code"> <code class="macmade-source">myBlock = ^( <span class="macmade-code-keyword">void</span> )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    x++</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">return</span> x;</code><br />
 <code class="macmade-source">};</code> </div>
<div> Le compilateur refusera ici de compiler le programme, puisque la variable «x» n&#8217;est disponible qu&#8217;en lecture pour notre block. </div>
<div> Pour qu&#8217;une variable puisse être modifiée depuis un block, il faut la déclarer avec le mot clé «__block».<br />
 Ainsi, le codé précédent est valide si l&#8217;on déclare la variable x ainsi: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">__block</span> <span class="macmade-code-keyword">int</span> x;</code> </div>
<h4>Gestion de la mémoire</h4>
<div> Au niveau C, un block est une structure, pouvant être copiée et détruite.<br />
 Deux fonctions C sont à disposition pour cet usage: «Block_copy()» et «Block_destroy».<br />
 En Objective-C, un block peut également recevoir les messages «retain», «release» et «copie», comme un objet. </div>
<div> C&#8217;est aspect peut-être extrêmement important dans le cas où un block doit être conservé pour une utilisation ultérieure (et par exemple stocké dans une propriété d&#8217;une classe). </div>
<div> Ne pas copier le block, ou ne pas effectuer de «retain» dans un tel cas peut en effet induire une erreur de segmentation. </div>
<h4>Exemple d&#8217;utilisation</h4>
<div> Les blocks peuvent être utilisés dans de très nombreux contextes, afin de simplifier le code, et réduire le nombre de fonctions déclarées. </div>
<div> Voici un exemple simple illustrant l&#8217;utilisation des blocks. </div>
<div> Nous allons ajouter à la classe «NSArray» une méthode statique permettant de générer un tableau en filtrant les éléments d&#8217;un autre tableau, à l&#8217;aide d&#8217;un callback. </div>
<div> Pour les amateurs de PHP, il s&#8217;agit ici d&#8217;un équivalent de la fonction «array_filter()». </div>
<div> Nous allons commencer par la déclaration d&#8217;une catégorie de la classe «NSArray». Pour rappel, une catégorie permet l&#8217;ajout de méthodes dans une classe existante, évitant ainsi le besoin de créer une sous-classe.</div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">@interface</span> <span class="macmade-code-predefined">NSArray</span>( BlockExample )</code></p>
<p> <code class="macmade-source">+ ( <span class="macmade-code-predefined">NSArray</span> * )arrayByFilteringArray: ( <span class="macmade-code-predefined">NSArray</span> * )source withCallback: ( <span class="macmade-code-keyword">BOOL</span> ( ^ )( <span class="macmade-code-keyword">id</span> ) )callback;</code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">@end</span></code> </div>
<div> Nous déclarons ici une méthode retournant un objet de type «NSArray», et prenant en argument un autre objet «NSArray», ainsi qu&#8217;un callback, sous forme de block. </div>
<div> Ce callback sera exécuté pour chaque élément du tableau passé en argument. Il doit retourner une valeur booléenne, afin de savoir si l&#8217;élément courant du tableau source doit être conservé dans le tableau retourné. Le block prend donc comme unique argument l&#8217;objet courant du tableau source. </div>
<div> Voyons maintenant l&#8217;implémentation de cette méthode: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> <span class="macmade-code-predefined">NSArray</span>( BlockExample )</code></p>
<p> <code class="macmade-source">+ ( <span class="macmade-code-predefined">NSArray</span> * )arrayByFilteringArray: ( <span class="macmade-code-predefined">NSArray</span> * )source withCallback: ( <span class="macmade-code-keyword">BOOL</span> ( ^ )( <span class="macmade-code-keyword">id</span> ) )callback</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSMutableArray</span> * result;</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">id</span>               element;</code></p>
<p> <code class="macmade-source">    result = [ <span class="macmade-code-predefined">NSMutableArray</span> <span class="macmade-code-predefined">arrayWithCapacity</span>: [ source count ] ];</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">for</span>( element <span class="macmade-code-keyword">in</span> source ) {</code></p>
<p> <code class="macmade-source">        <span class="macmade-code-keyword">if</span>( callback( element ) == <span class="macmade-code-keyword">YES</span> ) {</code></p>
<p> <code class="macmade-source">            [ result <span class="macmade-code-predefined">addObject</span>: element ];</code><br />
 <code class="macmade-source">        }</code><br />
 <code class="macmade-source">    }</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">return</span> result;</code><br />
 <code class="macmade-source">}</code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">@end</span></code> </div>
<div> Nous créons en premier lieu un tableau de taille dynamique («NSMutableArray»), en lui allouant une capacité initiale correspondant au nombre d&#8217;entrées du tableau source. </div>
<div> Ensuite, nous itérons chaque élément du tableau source, et nous ajoutons l&#8217;élément courant dans le cas où le résultat du callback retourne la valeur booléenne «YES». </div>
<div> Voici un exemple de programme utilisant une telle méthode.<br />
 Ici, nous nous servons du callback pour créer un tableau ne contenant que les objets de type «NSString» du tableau source: </div>
<div class="macmade-code"> <code class="macmade-source"><span class="macmade-code-keyword">#import</span> <span class="macmade-code-string">&lt;Cocoa/Cocoa.h&gt;</span></code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">@interface</span> <span class="macmade-code-predefined">NSArray</span>( BlockExample )</code></p>
<p> <code class="macmade-source">+ ( <span class="macmade-code-predefined">NSArray</span> * )arrayByFilteringArray: ( <span class="macmade-code-predefined">NSArray</span> * )source withCallback: ( <span class="macmade-code-keyword">BOOL</span> ( ^ )( <span class="macmade-code-keyword">id</span> ) )callback;</code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">@end</span></code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> <span class="macmade-code-predefined">NSArray</span>( BlockExample )</code></p>
<p> <code class="macmade-source">+ ( <span class="macmade-code-predefined">NSArray</span> * )arrayByFilteringArray: ( <span class="macmade-code-predefined">NSArray</span> * )source withCallback: ( <span class="macmade-code-keyword">BOOL</span> ( ^ )( <span class="macmade-code-keyword">id</span> ) )callback</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSMutableArray</span> * result;</code><br />
 <code class="macmade-source">    <span class="macmade-code-keyword">id</span>               element;</code></p>
<p> <code class="macmade-source">    result = [ <span class="macmade-code-predefined">NSMutableArray</span> <span class="macmade-code-predefined">arrayWithCapacity</span>: [ source count ] ];</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">for</span>( element <span class="macmade-code-keyword">in</span> source ) {</code></p>
<p> <code class="macmade-source">        <span class="macmade-code-keyword">if</span>( callback( element ) == <span class="macmade-code-keyword">YES</span> ) {</code></p>
<p> <code class="macmade-source">            [ result <span class="macmade-code-predefined">addObject</span>: element ];</code><br />
 <code class="macmade-source">        }</code><br />
 <code class="macmade-source">    }</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">return</span> result;</code><br />
 <code class="macmade-source">}</code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">@end</span></code></p>
<p> <code class="macmade-source"><span class="macmade-code-keyword">int</span> main( <span class="macmade-code-keyword">void</span> )</code><br />
 <code class="macmade-source">{</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSAutoreleasePool</span> * pool;</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSArray</span>           * array1;</code><br />
 <code class="macmade-source">    <span class="macmade-code-predefined">NSArray</span>           * array2;</code></p>
<p> <code class="macmade-source">    pool   = [ [ <span class="macmade-code-predefined">NSAutoreleasePool</span> alloc ] init ];</code><br />
 <code class="macmade-source">    array1 = [ <span class="macmade-code-predefined">NSArray</span> <span class="macmade-code-predefined">arrayWithObjects</span>: <span class="macmade-code-string">@"Hello World!"</span>, [ <span class="macmade-code-predefined">NSDate</span> date ], <span class="macmade-code-string">@"Hello Universe!"</span>, <span class="macmade-code-keyword">nil</span> ];</code><br />
 <code class="macmade-source">    array2 = [ <span class="macmade-code-predefined">NSArray</span></code><br />
 <code class="macmade-source">                    <span class="macmade-code-ctag">arrayByFilteringArray</span>: array1</code><br />
 <code class="macmade-source">                    <span class="macmade-code-ctag">withCallback</span>: ^ <span class="macmade-code-keyword">BOOL</span> ( <span class="macmade-code-keyword">id</span> element )</code><br />
 <code class="macmade-source">                    {</code><br />
 <code class="macmade-source">                        <span class="macmade-code-keyword">return</span> [ element <span class="macmade-code-predefined">isKindOfClass</span>: [ <span class="macmade-code-predefined">NSString</span> class ] ];</code><br />
 <code class="macmade-source">                    }</code><br />
 <code class="macmade-source">             ];</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-predefined">NSLog</span>( <span class="macmade-code-string">@"%@"</span>, array2 );</code></p>
<p> <code class="macmade-source">    [ pool release ];</code></p>
<p> <code class="macmade-source">    <span class="macmade-code-keyword">return</span> EXIT_SUCCESS;</code><br />
 <code class="macmade-source">}</code></div>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/11/12/closure-et-fonctions-lambda-en-objective-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Leweb09 : pourquoi ce rendez-vous est indispensable</title>
		<link>http://blog.netinfluence.com/2009/10/08/leweb09-pourquoi-ce-rendez-vous-est-indispensable/</link>
		<comments>http://blog.netinfluence.com/2009/10/08/leweb09-pourquoi-ce-rendez-vous-est-indispensable/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 10:26:00 +0000</pubDate>
		<dc:creator>sandrine</dc:creator>
				<category><![CDATA[care]]></category>
		<category><![CDATA[e-commerce]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[leweb]]></category>
		<category><![CDATA[marketing]]></category>
		<category><![CDATA[social media]]></category>
		<category><![CDATA[stratégie]]></category>
		<category><![CDATA[zappos]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=83</guid>
		<description><![CDATA[Voici pourquoi j&#8217;irais au web09 et pourquoi je vous RECOMMANDE VIVEMENT d&#8217;y aller. Je ne dis pas ça par amitié uniquement pour les organisateurs, mais parce que le programme de la conférence cette année est extraordinaire. J&#8217;en parlais l&#8217;année passée, pour les entreprises, ce qui est important, c&#8217;est vraiment de pouvoir comprendre les avantages et les exemples de succès des entreprises qui utilisent les réseaux sociaux dans leur communication. Cette année, leweb09, rassemblera les leaders de ces plateformes avec des entreprises qui les utilisent. On y verra aussi de nombreux intervenant pour parler de la guerre iPhone &#8211; android et surtout on y parlera e-commerce, notamment avec Tony Hsieh de Zappos. Je sais que vous allez dire que le prix [...]]]></description>
			<content:encoded><![CDATA[<p>Voici pourquoi j&#8217;irais au web09 et pourquoi je vous RECOMMANDE VIVEMENT d&#8217;y aller.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://www.youtube.com/v/LkgvIsSO9Nw&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=fr&amp;feature=player_embedded&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/LkgvIsSO9Nw&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=fr&amp;feature=player_embedded&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Je ne dis pas ça par amitié uniquement pour les organisateurs, mais parce que le programme de la conférence cette année est <a href="http://www.leweb.net/">extraordinaire</a>. J&#8217;en parlais l&#8217;année passée, pour les entreprises, ce qui est important, c&#8217;est vraiment de pouvoir comprendre les avantages et les exemples de succès des entreprises qui utilisent les réseaux sociaux dans leur communication.</p>
<p>Cette année, leweb09, rassemblera les leaders de ces plateformes avec des entreprises qui les utilisent.  On y verra aussi de nombreux intervenant pour parler de la guerre iPhone &#8211; android et surtout on y parlera e-commerce, notamment avec Tony Hsieh de Zappos.</p>
<p>Je sais que vous allez dire que le prix est important, mais dites vous la chose suivante :<strong> c&#8217;est en gros ce que vous demandera un consultant à la journée pour vous dire probablement pas 1/5 de ce que vous allez entendre deux jours durant.</strong></p>
<p><a href="http://www.leweb.net/register">Alors dépensez cette somme et venez voir les acteurs</a>, ces pionniers en chair en en os et profitez de cette exceptionnelle opportunité de faire un networking de haut vol.</p>
<p>Et si vous venez de Suisse et vous sentez perdu, souhaitez que nous vous présentions les personnes qui comptent, je me tiens à votre disposition pour vous aider sur place et me réjoui de faire votre connaissance.</p>
<p>Si vous voulez économiser sur le billet, <a href="http://twitter.com/Raphaelbriner/statuses/4706613280">en y allant à plusieurs comme raphael le suggère vous pourrez profiter d&#8217;un rabais</a> &gt; surveillez twitter, vous n&#8217;êtes probablement pas les seuls à y aller.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/10/08/leweb09-pourquoi-ce-rendez-vous-est-indispensable/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Implémentation d’un système de délégation multiple en Objective-C</title>
		<link>http://blog.netinfluence.com/2009/08/24/implementation-d-un-systeme-de-delegation-multiple-en-objective-c/</link>
		<comments>http://blog.netinfluence.com/2009/08/24/implementation-d-un-systeme-de-delegation-multiple-en-objective-c/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 17:24:00 +0000</pubDate>
		<dc:creator>macmade</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[tutoriel]]></category>
		<category><![CDATA[wwdc]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=50</guid>
		<description><![CDATA[<p>La délégation est un système présent dans plusieurs classes du framework Cocoa, sous Mac OS X (et donc également sur iPhone OS).<br />
 Ce système permet aux dévelopeurs d'applications Cocoa d'interagir en fonction d'événement précis liés aux fonctionnements intrinsèques des objets Cocoa.</p> <p>De base, le système de délégation ne peut prendre en charge qu'un objet unique. Cet article montre comment implémenter une chaine de délégation dans une classe Objective-C.</p>]]></description>
			<content:encoded><![CDATA[<div class="macmade-grey">
<div class="macmade-small">Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found at: <a title="Free Documentation License" href="http://www.gnu.org/copyleft/fdl.html">http://www.gnu.org/copyleft/fdl.html</a></div>
</div>
<h3>1. Qu&#8217;est-ce que la délégation?</h3>
<div>La délégation est un système présent dans plusieurs classes du framework Cocoa, sous Mac OS X (et donc également sur iPhone OS).<br />
Ce système permet aux dévelopeurs d&#8217;applications Cocoa d&#8217;interagir en fonction d&#8217;événement précis liés aux fonctionnements intrinsèques des objets Cocoa.</div>
<div>Prenons par exemple l&#8217;objet NSWindow, qui comme son nom l&#8217;indique permet d&#8217;afficher et de contrôler une fenêtre.</div>
<div>Cet objet fenêtre possède un certain nombre de méthode, comme par exemple &#8216;close&#8217;, ou &#8216;open&#8217;, permettant respectivement d&#8217;ouvrir et de fermer le fenêtre en question.</div>
<div>Lors de la programmation d&#8217;une application Cocoa, il peut être fort utile d&#8217;être informé lors de l&#8217;ouverture ou de la fermeture d&#8217;une fenêtre, pour allouer ou libérer des ressources, terminer des tâches ou des threads, etc.</div>
<div>Le système de délégation du framework Cocoa permet ainsi d&#8217;attacher une instance d&#8217;un objet à un autre objet, le premier ayant la possibilité d&#8217;agir sur le second en fonction de ses différentes phases d&#8217;exécution.</div>
<div>La définition d&#8217;un objet délégué sur un autre objet se passe par convention par la méthode &#8216;setDelegate&#8217;, prenant en argument unique l&#8217;instance du délégué.</div>
<div>Par exemple, pour définir un objet de type &#8216;Foo&#8217; comme délégué d&#8217;un objet NSWindow:</div>
<div class="macmade-code"><code class="macmade-source">Foo      * foo    = [ [ Foo alloc ] init ];<br />
</code> <code class="macmade-source"><span class="macmade-code-predefined">NSWindow</span> * window = [ [ <span class="macmade-code-predefined">NSWindow</span> alloc ] <span class="macmade-code-predefined">initWithContentRect</span>: <span class="macmade-code-predefined">NSMakeRect</span>( 0, 0, 100, 100 ) <span class="macmade-code-predefined">styleMask</span>: <span class="macmade-code-predefined">NSTitledWindowMask</span> <span class="macmade-code-predefined">backing</span>: <span class="macmade-code-predefined">NSBackingStoreBuffered</span> <span class="macmade-code-predefined">defer</span>: <span class="macmade-code-keyword">NO</span> ];<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">[ window <span class="macmade-code-predefined">setDelegate</span>: foo ];</code></div>
<div>Les deux premières lignes créent respectivement un objet de type &#8216;Foo&#8217; (défini dans notre application), et un objet de type &#8216;NSWindow&#8217; (du framework Cocoa).</div>
<div>La troisième ligne défini l&#8217;objet de type &#8216;Foo&#8217; comme délégué de notre objet &#8216;NSWindow&#8217;.</div>
<div>A partir de ce moment, à supposer que l&#8217;on ferme notre objet fenêtre:</div>
<div class="macmade-code"><code class="macmade-source">[ window close ];</code></div>
<div>L&#8217;objet délégué pourra être averti de cette opération, en implémentant tout simplement une méthode spécifique. Dans le cas précis, &#8216;windowWillClose&#8217;, dont voici le prototype:</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )windowWillClose: ( <span class="macmade-code-predefined">NSNotification</span> * )notification;</code></div>
<div>Celle-ci permettra au délégué, juste avant la fermeture de la fenêtre, d&#8217;effectuer un certain nombre d&#8217;opérations, liées au bon fonctionnement de l&#8217;application.</div>
<h3>2. Comment fonctionne la délégation?</h3>
<div>Voyons maintenant comment l&#8217;objet &#8216;NSWIndow&#8217; implémente et utilise son objet délégué.</div>
<div>L&#8217;objet &#8216;NSWindow&#8217; contient bien sûr une variable d&#8217;instance de type &#8216;id&#8217;, représentant l&#8217;objet délégué, généralement nommée delegate, ainsi qu&#8217;une méthode permettant d&#8217;obtenir l&#8217;objet délégué, et une seconde permettant de le définir.</div>
<div>Autrement dit:</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-keyword">@interface</span> <span class="macmade-code-predefined">NSWindow</span>: <span class="macmade-code-predefined">NSObject</span><br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@protected</span><br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">id</span> <span class="macmade-code-ctag">delegate</span>;<br />
</code> <code class="macmade-source">}<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">id</span> )delegate;<br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )setDelegate: ( <span class="macmade-code-keyword">id</span> )object;<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@end</span><br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> <span class="macmade-code-predefined">NSWindow</span><br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">id</span> )delegate<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span> <span class="macmade-code-ctag">delegate</span>;<br />
</code> <code class="macmade-source">}<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )setDelegate: ( <span class="macmade-code-keyword">id</span> )object<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-ctag">delegate</span> = object;<br />
</code> <code class="macmade-source">}<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@end</span></code></div>
<div>Ici, il est extrêmement important de préciser qu&#8217;un objet ne doit en aucun cas effectuer un &#8216;retain&#8217; sur son objet délégué, car cela aurait comme effet un &#8216;memory leak&#8217;, autrement dit une zone de mémoire allouée à notre application qui ne serait jamais libérée.</div>
<div>Il est également à noter qu&#8217;en Objective-C 2.0, l&#8217;utilisation d&#8217;une propriété peut être utilisée dans l&#8217;interface, pour permettre un accès aisé à l&#8217;objet délégué:</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-keyword">@property</span>( <span class="macmade-code-keyword">nonatomic</span>, <span class="macmade-code-keyword">assign</span>, <span class="macmade-code-keyword">readwrite</span> ) <span class="macmade-code-ctag">delegate</span>;</code></div>
<div>A partir de là, les getter/setter peuvent également être automatiquement délcarés dans l&#8217;implémentation:</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-keyword">@synthesize</span> delegate;</code></div>
<div>Si l&#8217;on reprend maintenant l&#8217;exemple de la méthode &#8216;close&#8217; de l&#8217;objet &#8216;NSWindow&#8217;:</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )close<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-comment">// Do something...</span><br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( [ <span class="macmade-code-ctag">delegate</span> <span class="macmade-code-predefined">respondsToSelector</span>: <span class="macmade-code-keyword">@selector</span>( windowWillClose ) ] ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> [ <span class="macmade-code-ctag">delegate</span> windowWillClose ];<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-comment">// Do something...</span><br />
</code> <code class="macmade-source">}</code></div>
<div>A un instant précis dans l&#8217;exécution de la méthode &#8216;close&#8217;, l&#8217;objet &#8216;NSWindow&#8217; se demande si son objet délégué possède une méthode nommée &#8216;windowWillClose&#8217;.<br />
Si c&#8217;est le cas, elle l&#8217;exécute, et poursuit sa propre exécution.</div>
<div>La méthode &#8216;close&#8217; n&#8217;a nullement besoin de vérifier si un objet délégué a été défini auparavant, étant donné qu&#8217;en Objective-C, envoyer un message (appeler une méthode) sur &#8216;nil&#8217; (un pointeur NULL sur un objet) est parfaitement valide.</div>
<div>L&#8217;objet délégué sera donc averti, à supposer qu&#8217;il implémente la méthode &#8216;windowWillClose&#8217;, de la fermeture de l&#8217;objet &#8216;NSWindow&#8217;.</div>
<h3>3. Délégation et notification</h3>
<div>Le framework Cocoa inclut également un système de notification, permettant là aussi à des objets d&#8217;être informé des stades d&#8217;exécution d&#8217;autres objets.</div>
<div>Dans notre exemple précédent, nous aurions donc aussi pu, pour être averti lors de la fermeture de la fenêtre, écrire le code suivant.</div>
<div class="macmade-code"><code class="macmade-source">[ [ <span class="macmade-code-predefined">NSNotificationCenter</span> defaultCenter ] <span class="macmade-code-predefined">addObserver</span>: foo <span class="macmade-code-predefined">selector</span>: <span class="macmade-code-keyword">@selector</span>( myObserverMethod: ) <span class="macmade-code-predefined">name:</span> <span class="macmade-code-predefined">NSWindowWillCloseNotification</span> <span class="macmade-code-predefined">object</span>: window ]:</code></div>
<div>Autrement dit, on déclare que la méthode &#8216;myObserverMethod&#8217; de l&#8217;objet de type &#8216;Foo&#8217; doit être lancée lors de l&#8217;événement &#8216;NSWindowWillCloseNotification&#8217; de la fenêtre. Dans ce cas, voici le prototype de la méthode &#8216;myObserverMethod&#8217;:</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )myObserverMethod: ( <span class="macmade-code-predefined">NSNotification</span> * )notification;</code></div>
<div>On peut donc ici se demander pourquoi ces deux systèmes cohexistent.<br />
Ce qu&#8217;il faut bien comprendre, c&#8217;est que le système de notification permet uniquement d&#8217;être averti de certains événements, alors que le système de délégation permet en plus de modifier le comportement de l&#8217;objet concerné.</div>
<div>Prenons le cas de la méthode &#8216;windowShouldClose&#8217;, pouvant être implémentée dans le délégué d&#8217;un objet &#8216;NSWindow&#8217;, et dont voici le prototype:</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-keyword">BOOL</span> )windowShouldClose: ( <span class="macmade-code-predefined">NSWindow</span> * )window;</code></div>
<div>On remarque que cette méthode retourne une valeur booléenne.</div>
<div>Si notre objet délégué implémente cette méthode, et qu&#8217;on lance la méthode &#8216;close&#8217; sur notre fenêtre, cette dernière ne se fermera effectivement que dans le cas où la méthode du délégué retourne la valeur &#8216;YES&#8217;. Dans le cas contraire, elle restera affichée sur l&#8217;écran.</div>
<div>Cela peut par exemple permettre de bloquer le processus de fermeture de la fenêtre, pour afficher un message d&#8217;alerte demandant à l&#8217;utilisateur s&#8217;il veut sauvegarder ses changements éventuels.</div>
<div>A ce moment là, c&#8217;est le délégué qui prend la responsabilité de savoir si et quand la fenêtre doit être fermée, ce qui serait évidemment impossible via le système de notification.</div>
<div>On voit donc ici bien la différence de logique entre la délégation et la notification, le premier pouvant agir sur l&#8217;objet concerné, au contraire du second.</div>
<div>Certains objets du framework Cocoa utilisent également leur délégué pour obtenir d&#8217;autre types d&#8217;informations, comme par exemple l&#8217;objet &#8216;NSBrowser&#8217; (la vue en colonne du Finder) qui utilise son délégué pour connaître les éléments à afficher.</div>
<h3>4. Chaîne de délégation</h3>
<div>A ce niveau là, on peut remarquer une certaine limitation dans le système de délégation. Un objet ne peut avoir qu&#8217;un seul et unique délégué.</div>
<div>Prenons le code suivant:</div>
<div class="macmade-code"><code class="macmade-source">[ window <span class="macmade-code-predefined">setDelegate</span>: foo ];<br />
</code> <code class="macmade-source">[ window <span class="macmade-code-predefined">setDelegate</span>: bar ];</code></div>
<div>Le délégué de l&#8217;objet &#8216;window&#8217; sera donc &#8216;bar&#8217;, qui remplacera &#8216;foo&#8217; à ce poste. L&#8217;objet &#8216;foo&#8217;, quand à lui, ne sera plus du tout en mesure de contrôler les différents aspects de la fenêtre.</div>
<div>Or il pourrait être fort utile, dans certains cas, de pouvoir placer plusieurs délégués sur un même objet. Nous allons donc implémenter un système permettant de chaîner les objet délégués.</div>
<h3>5. Implémentation &#8211; MultipleDelegateObject</h3>
<div>Nous allons tout d&#8217;abord créer un classe, qui servira de base aux classes voulant implémenter une chaîne de délégués:</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-comment">/* MultipleDelegateObject.h */</span><br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@interface</span> MultipleDelegateObject: <span class="macmade-code-predefined">NSObject</span><br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@protected</span><br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-ctag">DelegateChain</span> * <span class="macmade-code-ctag">delegate</span>;<br />
</code> <code class="macmade-source">}<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )addDelegate: ( <span class="macmade-code-keyword">id</span> )object;<br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )removeDelegate: ( <span class="macmade-code-keyword">id</span> )object;<br />
</code> <code class="macmade-source">- ( <span class="macmade-code-predefined"><span class="macmade-code-predefined">NSArray</span></span> * )delegates;<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@end</span>;</code></div>
<div>Nous n&#8217;allons pas gérer la chaîne de délégué dans cette objet, mais plutôt créer une seconde classe, nommée &#8216;DelegateChain&#8217;, que nous étudierons après.</div>
<div>Notre classe contient donc une méthode permettant d&#8217;ajouter un délégué, une méthode permettant d&#8217;en enlever un, et une méthode permettant d&#8217;obtenir sous forme de tableau tous les objets délégués.</div>
<div>L&#8217;implémentation est la suivante:</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-comment">/* MultipleDelegateObject.m */</span><br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@implementation</span><br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">id</span> )init<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( ( <span class="macmade-code-keyword">self</span> = [ <span class="macmade-code-keyword">super</span> init ] ) ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-ctag">delegate</span> = [ [ <span class="macmade-code-ctag">DelegateChain</span> alloc ] init ];<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span> <span class="macmade-code-keyword">self</span>;<br />
</code> <code class="macmade-source">}<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )dealloc<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> [ <span class="macmade-code-ctag">delegate</span> release ];<br />
</code> <code class="macmade-source"> [ <span class="macmade-code-keyword">super</span> dealloc ];<br />
</code> <code class="macmade-source">}<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )addDelegate: ( <span class="macmade-code-keyword">id</span> )object<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> [ <span class="macmade-code-ctag">delegate</span> <span class="macmade-code-ctag">addDelegate</span>: object ];<br />
</code> <code class="macmade-source">}<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )removeDelegate: ( <span class="macmade-code-keyword">id</span> )object<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> [ <span class="macmade-code-ctag">delegate</span> <span class="macmade-code-ctag">removeDelegate</span>: object ];<br />
</code> <code class="macmade-source">}<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">- ( <span class="macmade-code-predefined"><span class="macmade-code-predefined">NSArray</span></span> * )delegates<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span> [ <span class="macmade-code-ctag">delegate</span> <span class="macmade-code-ctag">delegates</span> ];<br />
</code> <code class="macmade-source">}<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@end</span></code></div>
<div>La méthode &#8216;init&#8217; crée une nouvelle instance de la classe &#8216;DelegateChain&#8217;, et la stocke dans la variable d&#8217;instance &#8216;delegate&#8217;. La méthode &#8216;dealloc&#8217; libère cette resource lors de la destruction de l&#8217;objet.</div>
<div>Les trois autres méthodes ne font que re-router les appels sur l&#8217;objet de type &#8216;DelegateChain&#8217;, qui gérera elle les délégués multiples.</div>
<h3>6. Implémentation &#8211; DelegateChain</h3>
<div>Regardons maintenant l&#8217;interface de la classe &#8216;DelegateChain&#8217;:</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-comment">/* DelegateChain.h */</span><br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@interface</span> DelegateChain: <span class="macmade-code-predefined">NSObject</span><br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@protected</span><br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">id</span> * <span class="macmade-code-ctag">delegates</span>;<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSUInteger</span> <span class="macmade-code-ctag">numberOfDelegates</span>;<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSUInteger</span> <span class="macmade-code-ctag">sizeOfDelegatesArray</span>;<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSMutableDictionary</span> * <span class="macmade-code-ctag">hashs</span>;<br />
</code> <code class="macmade-source">}<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )addDelegate: ( <span class="macmade-code-keyword">id</span> )object;<br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )removeDelegate: ( <span class="macmade-code-keyword">id</span> )object;<br />
</code> <code class="macmade-source">- ( <span class="macmade-code-predefined">NSArray</span> * )delegates;<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@end</span></code></div>
<div>Comme précisé auparavant, il ne faut pas effectuer de &#8216;retain&#8217; sur les objets délégués. Il nous est donc impossible d&#8217;utiliser un objet de type &#8216;NSMutableArray&#8217; ou &#8216;NSMutableDictionary&#8217; pour stocker les délégués, car ceci aurait pour effet un &#8216;retain&#8217; automatique lors de l&#8217;ajout.</div>
<div>Un tableau de pointeur sur les délégués (le type &#8216;id&#8217; est en fait un pointeur), alloué et ré-alloué si nécessaire avec les fonctions d&#8217;allocation de mémoire de la bibliothèque standard C, fera par contre très bien l&#8217;affaire. Il s&#8217;agit dans notre cas de la variable d&#8217;instance &#8216;delegates&#8217;.</div>
<div>Nous avons également une variable contenant le nombre de délégués actuellement affectés (&#8216;numberOfDelegates&#8217;), et une autre (&#8216;sizeOfDelegatesArray&#8217;) contenant la taille du tableau de pointeur précédemment cité, et dont nous verrons l&#8217;utilité plus tard.</div>
<div>La variable &#8216;hash&#8217;, quand à elle, servira à stocker les adresses mémoire des délégués, afin de trouver facilement leur position dans le tableau de pointeur.</div>
<div>Regardons maintenant, méthode par méthode, l&#8217;implémentation de la classe &#8216;DelegateChain&#8217;. En tout premier lieu, son initialisation:</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-keyword">id</span> )init<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( ( <span class="macmade-code-keyword">self</span> = [ <span class="macmade-code-keyword">super</span> init ] ) ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> hash = [ [ <span class="macmade-code-predefined">NSMutableDictionary</span> <span class="macmade-code-predefined">dictionaryWithCapacity</span>: 10 ] retain ];<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( <span class="macmade-code-keyword">NULL</span> = ( <span class="macmade-code-ctag">delegates</span> = ( <span class="macmade-code-keyword">id</span> * )<span class="macmade-code-predefined">calloc</span>( 10, <span class="macmade-code-keyword">sizeof</span>( <span class="macmade-code-keyword">id</span> ) ) ) ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-comment">// Error management...</span><br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span> <span class="macmade-code-keyword">self</span>;<br />
</code> <code class="macmade-source">}</code></div>
<div>Nous créons le dictionnaire qui nous permettra de stocker les adresses mémoire, et nous réservons une zone dans la mémoire pour stocker les pointeurs vers nos objets délégués. Nous réservons une zone pouvant contenir 10 objets, afin d&#8217;éviter d&#8217;avoir à appeler les fonctions d&#8217;allocation à chaque fois qu&#8217;un délégué est ajouté, ce qui nuirait aux performances. En cas de dépassement, nous ré-allouerons cette zone par 10.</div>
<div>Comme nous avons réservé de la mémoire, il ne faut pas oublier de la libérer lors de la destruction de l&#8217;objet:</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )dealloc<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">free</span>( <span class="macmade-code-ctag">delegates</span> );<br />
</code> <code class="macmade-source"> [ <span class="macmade-code-ctag">hashs</span> release ];<br />
</code> <code class="macmade-source"> [ <span class="macmade-code-keyword">super</span> dealloc ];<br />
</code> <code class="macmade-source">}</code></div>
<div>Regardons maintenant la méthode utilisée pour ajouter un délégué:</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )addDelegate: ( <span class="macmade-code-keyword">id</span> )object<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSString</span> * hash;<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( object == <span class="macmade-code-keyword">nil</span> ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span>;<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( <span class="macmade-code-ctag">numberOfDelegates</span> == <span class="macmade-code-ctag">sizeOfDelegatesArray</span> ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( <span class="macmade-code-keyword">NULL</span> == ( <span class="macmade-code-ctag">delegates</span> = ( <span class="macmade-code-keyword">id</span> * )<span class="macmade-code-predefined">realloc</span>( <span class="macmade-code-ctag">delegates</span>, ( <span class="macmade-code-ctag">sizeOfDelegatesArray</span> + 10 ) * <span class="macmade-code-keyword">sizeof</span>( <span class="macmade-code-keyword">id</span> ) ) ) ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-comment">// Error management...</span><br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-ctag">sizeOfDelegatesArray</span> += 10;<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> hash = [ [ <span class="macmade-code-predefined">NSNumber</span> <span class="macmade-code-predefined">numberWithUnsignedInteger</span>: ( <span class="macmade-code-predefined">NSUInteger</span> )object ] stringValue ];<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( [ <span class="macmade-code-ctag">hashs</span> <span class="macmade-code-predefined">objectForKey</span>: hash ] != <span class="macmade-code-keyword">nil</span> ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span>;<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-ctag">delegates</span>[ <span class="macmade-code-ctag">numberOfDelegates</span> ] = object;<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> [ <span class="macmade-code-ctag">hashs</span> <span class="macmade-code-predefined">setObject</span>: [ <span class="macmade-code-predefined">NSNumber</span> <span class="macmade-code-predefined">numberWithUnsignedInteger</span>: <span class="macmade-code-ctag">numberOfDelegates</span> ] <span class="macmade-code-predefined">forKey</span>: hash ];<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-ctag">numberOfDelegates</span>++;<br />
</code> <code class="macmade-source">}</code></div>
<div>Nous avons précédemment alloué un emplacement pour 10 délégués. A supposer qu&#8217;il y en ait 10, et que nous ajoutons un onzième, nous augmentons la zone mémoire de 10, grâce à la fonction &#8216;realloc&#8217;.</div>
<div>Nous prenons ensuite l&#8217;adresse mémoire de l&#8217;objet, sous forme de chaîne de charactère, et nous contrôlons que l&#8217;objet n&#8217;a pas déjà ajouté comme délégué. De cette façon, il est impossible d&#8217;ajouter plusieurs fois le même objet comme délégué.</div>
<div>Il ne nous reste plus qu&#8217;à stocker le pointeur vers notre objet, son adresse mémoire avec sa position dans le tableau de pointeur, et augmenter de 1 la variable contenant le nombre de délégués.</div>
<div>Sur le même principe, voici la fonction permettant d&#8217;enlever un délégué.</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )removeDelegate: ( <span class="macmade-code-keyword">id</span> )object<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSString</span> * hash;<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSUInteger</span> index;<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSUInteger</span> i;<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( object == <span class="macmade-code-keyword">nil</span> || <span class="macmade-code-ctag">numberOfDelegates</span> == 0 ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span>;<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> hash = [ [ <span class="macmade-code-predefined">NSNumber</span> <span class="macmade-code-predefined">numberWithUnsignedInteger</span>: ( <span class="macmade-code-predefined">NSUInteger</span> )object ] stringValue ];<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( [ <span class="macmade-code-ctag">hashs</span> <span class="macmade-code-predefined">objectForKey</span>: hash ] == <span class="macmade-code-keyword">nil</span> ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span>;<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> index = [ [ <span class="macmade-ctag">hashs</span> <span class="macmade-code-predefined">objectForKey</span>: hash ] unsignedIntegerValue ];<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">for</span>( i = index; i &lt; <span class="macmade-code-ctag">numberOfDelegates</span> - 1; i++ ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-ctag">delegates</span>[ i ] = <span class="macmade-code-ctag">delegates</span>[ i + 1 ];<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> [ hash <span class="macmade-code-predefined">removeObjectForKey</span>: hash ];<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-ctag">numberOfDelegates</span>--;<br />
</code> <code class="macmade-source">}</code></div>
<div>Le fonctionnement de cette méthode repose sur le même principe que la précédente, avec une petite subtilité.</div>
<div>A supposer que l&#8217;on aie 5 délégués, et que l&#8217;on enlève l&#8217;objet se trouvant en position 3 dans notre tableau de pointeur, nous aurons un trou. Pour éviter cela, nous décalons donc également tous les pointeurs se trouvant après celui que nous avons ôté.</div>
<div>Et en dernier lieu, la méthode permettant d&#8217;obtenir un tableau contenant tous les objets délégués.</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-predefined">NSArray</span> * )delegates<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSUInteger</span> i;<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSMutableArray</span> * delegatesArray;<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( <span class="macmade-code-ctag">numberOfDelegates</span> == 0 ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span> [ <span class="macmade-code-predefined">NSArray</span> array ];<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> delegatesArray = [ <span class="macmade-code-predefined">NSMutableArray</span> <span class="macmade-code-predefined">arrayWithCapacity</span>: <span class="macmade-code-ctag">numberOfDelegates</span> ];<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">for</span>( i = 0; i &lt; <span class="macmade-code-ctag">numberOfDelegates</span>; i++ ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> [ delegatesArray <span class="macmade-code-predefined">addObject</span>: <span class="macmade-code-ctag">delegates</span>[ i ] ];<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span> [ <span class="macmade-code-predefined">NSArray</span> <span class="macmade-code-predefined">arrayWithArray</span>: delegatesArray ];<br />
</code> <code class="macmade-source">}<br />
</code></div>
<div>Il s&#8217;agit d&#8217;une simple boucle sur notre tableau de pointeur, qui ajoute les objets pointés dans un objet de type &#8216;NSArray&#8217;.</div>
<h3>7. Runtime et re-routage des méthodes</h3>
<div>Nous avons vu plus haut que, pour déterminer si le délégué possède une certaine méthode, il fallait utiliser la méthode &#8216;respondsToSelector&#8217; sur l&#8217;objet délégué.</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-keyword">if</span>( [ <span class="macmade-code-ctag">delegate</span> <span class="macmade-code-predefined">respondsToSelector</span>: <span class="macmade-code-keyword">@selector</span>( someMethod ) ] ) {}</code></div>
<div>Pour éviter de changer les habitudes de programmation des dévelopeurs Cocoa, nous allons rendre ceci possible sur notre objet &#8216;DelegateChain&#8217;.</div>
<div>Actuellement. le code ci-dessus n&#8217;a aucune chance de fonctionner, vu que notre objet &#8216;DelegateChain&#8217;, qui contient les délégués, ne possède bien sûr pas leurs méthodes à son étage.</div>
<div>Nous pouvons par contre parfaitement surcharger (re-déclarer) dans notre classe la méthode &#8216;respondToSelector&#8217; (à l&#8217;origine, elle est déclarée dans la classe &#8216;NSObject&#8217;), pour lui affecter un comportement autre que celui par défaut.</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-keyword">BOOL</span> )<span class="macmade-code-predefined">respondsToSelector</span>: ( <span class="macmade-code-keyword">SEL</span> )selector<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSUInteger</span> i;<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">for</span>( i = 0; i &lt; <span class="macmade-code-ctag">numberOfDelegates</span>; i++ ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( [ <span class="macmade-code-ctag">delegates</span>[ i ] <span class="macmade-code-predefined">respondsToSelector</span>: selector ] == <span class="macmade-code-keyword">YES</span> ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span> <span class="macmade-code-keyword">YES</span>;<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span> <span class="macmade-code-keyword">NO</span>;<br />
</code> <code class="macmade-source">}<br />
</code></div>
<div>Nous effectuons donc une boucle sur notre tableau de pointeur, et contrôlons si l&#8217;un des délégué possède la méthode demandée. De cette manière, nous pouvons utiliser notre objet &#8216;DelegateChain&#8217; comme s&#8217;il s&#8217;agissait d&#8217;un délégué normal et unique.</div>
<div>Pour que cela fonctionne, il nous faut également surcharger la méthode &#8216;methodSignatureForSelector&#8217; (NSObject). Celle-ci permet à l&#8217;environnement runtime d&#8217;Objective-C d&#8217;obtenir les infos nécessaires sur une méthode particulière, comme son type de retour, ses arguments, etc.</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-predefined">NSMethodSignature</span> * )methodSignatureForSelector: ( <span class="macmade-code-keyword">SEL</span> )selector<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSUInteger</span> i;<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">for</span>( i = 0; i &lt; <span class="macmade-code-ctag">numberOfDelegates</span>; i++ ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( [ <span class="macmade-code-ctag">delegates</span>[ i ] <span class="macmade-code-predefined">respondsToSelector</span>: selector ] == <span class="macmade-code-keyword">YES</span> ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span> [ [ <span class="macmade-code-ctag">delegates</span>[ i ] class ] <span class="macmade-code-predefined">instanceMethodSignatureForSelector</span>: selector ];<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">return</span> <span class="macmade-code-keyword">nil</span>;<br />
</code> <code class="macmade-source">}</code></div>
<div>Désormais, nous pouvons savoir si au moins un délégué possède une méthode spécifique. Mais comment appeler le ou les délégués contenant cette méthode?</div>
<div>Ici aussi, nous allons garder le même système d&#8217;appel que pour un délégué unique, à savoir que la méthode désirée sera appelée directement sur notre objet &#8216;DelegateChain&#8217;, qui devra se charger de re-router cet appel vers le ou les délégués concernés.</div>
<div>Pour ce faire, nous allons implémenter la méthode &#8216;forwardInvocation&#8217; dans notre classe.</div>
<div>Cette dernière est automatiquement appelée par l&#8217;environnement runtime d&#8217;Objective-C lorsqu&#8217;une méthode est appelée sur un objet  ne la possédant pas. Ceci afin de donner une dernière chance à l&#8217;objet en question de gérer l&#8217;erreur.</div>
<div>Le même genre de concept est utilisé dans de nombreux langages de programmation objet. On peut par exemple citer les méthodes virtuelles de C++ ou encore la méthode &#8216;__call&#8217; en PHP5.</div>
<div class="macmade-code"><code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )forwardInvocation: ( NSInvocation * )invocation<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSUInteger</span> i;<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">for</span>( i = 0; i &lt; <span class="macmade-code-ctag">numberOfDelegates</span>; i++ ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> <span class="macmade-code-keyword">if</span>( [ <span class="macmade-code-ctag">delegates</span>[ i ] <span class="macmade-code-predefined">respondsToSelector</span>: [ invocation selector ] ] == <span class="macmade-code-keyword">YES</span> ) {<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"> [ invocation <span class="macmade-code-predefined">invokeWithTarget</span>: <span class="macmade-code-ctag">delegates</span>[ i ] ];<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source"> }<br />
</code> <code class="macmade-source">}</code></div>
<div>Le système de délégation multiple est ici complétement opérationnel. Pour en bénéficier dans une classe, il suffit désormais que cette dernière soit une sous-classe de &#8216;MultipleDelegateObject&#8217;. Aucune autre implémentation n&#8217;est nécessaire.</div>
<h3>8. Conclusion</h3>
<div>Un tel système permet de définir des classes ayant un nombre infini de délégués. Par contre, les objets intrinsèques du framework Cocoa, tels &#8216;NSWindow&#8217;, ne pourront pas bénéficier de ce système.</div>
<div>Il est par contre parfaitement envisageable d&#8217;implémenter ce système de délégation multiple sur des objets comme &#8216;NSWindow&#8217;.</div>
<div>Le language Objective-C permet en effet la définition de catégories, permettant d&#8217;ajouter des méthodes dans n&#8217;importe quel objet disponible, que celui-ci soit défini dans notre projet, ou qu&#8217;il fasse partie d&#8217;un framework du système. Par exemple:</div>
<div class="macmade-code"><code class="macmade-source"><span class="macmade-code-keyword">@interface</span> <span class="macmade-code-predefined">NSObject</span>( MyCategory )<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )sayHello;<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@end</span><br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@implementation</span> <span class="macmade-code-predefined">NSObject</span>( MyCategory )<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source">- ( <span class="macmade-code-keyword">void</span> )sayHello<br />
</code> <code class="macmade-source">{<br />
</code> <code class="macmade-source"> <span class="macmade-code-predefined">NSLog</span>( <span class="macmade-code-string">@"Hello world!"</span> );<br />
</code> <code class="macmade-source">}<br />
</code> <code class="macmade-source"><br />
</code> <code class="macmade-source"><span class="macmade-code-keyword">@end</span></code></div>
<div>Le code ci-dessus ajoute une méthode &#8216;sayHello&#8217; dans la classe &#8216;NSObject&#8217;, faisant partie du framework Cocoa. Comme &#8216;NSObject&#8217; est la classe de base pour toutes les classes Objective-C, toutes les classes disponibles possèdent maintenant une méthode &#8216;sayHello&#8217;.</div>
<div>Nous pourrions donc parfaitement ajouter les méthodes &#8216;addDelegate&#8217;, &#8216;removeDelegate&#8217; et &#8216;delegates&#8217; à l&#8217;objet &#8216;NSWindow&#8217;.</div>
<div>La seule limitation des catégories est qu&#8217;il est impossible d&#8217;ajouter des variables d&#8217;instance à une classe. Par contre, l&#8217;objet &#8216;NSWindow&#8217; possède déjà une variable d&#8217;instance prévue pour le délégué. Il faudra simplement ne pas oublier de redéfinir la méthode &#8216;setDelegate&#8217; de &#8216;NSWindow&#8217; dans notre catégorie. L&#8217;utilisation d&#8217;une variable globale statique (donc dont l&#8217;accès est limité au fichier qui l&#8217;a déclarée) est également une possibilité envisageable pour stocker les chaînes de délégués.</div>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/08/24/implementation-d-un-systeme-de-delegation-multiple-en-objective-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>EVENT &#124; NETALKS – Join our meeting on keynote &amp; iPhone 3GS</title>
		<link>http://blog.netinfluence.com/2009/06/09/event-feedback-from-the-keynote-iphone-3gs-talks/</link>
		<comments>http://blog.netinfluence.com/2009/06/09/event-feedback-from-the-keynote-iphone-3gs-talks/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 06:57:00 +0000</pubDate>
		<dc:creator>sandrine</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[keynote]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=74</guid>
		<description><![CDATA[Back from the keynote and based an what info is public (NDA should run for quite a few months based on last year), we propose to organize a casual &#8220;unmeeting&#8221; on thursday 18th in our office. This not-quite-a-meeting would allow attendees to share info, for those who have been to San Francisco and ask questions for those of you willing to take advantage of developments on the iPhone. The event is open but please register by mail (contact at netinfluence.ch) so that we make sure all of us can fit in the room and that we get sufficient drinks So if you want to talk about what to develop, how, what comes next and keynote impressions, join us on thursday [...]]]></description>
			<content:encoded><![CDATA[<p>Back from the keynote and based an what info is public (NDA should run for quite a few months based on last year), we propose to organize a casual &#8220;unmeeting&#8221; on thursday 18th in our office. This not-quite-a-meeting would allow attendees to share info, for those who have been to San Francisco and ask questions for those of you willing to take advantage of developments on the iPhone. The event is open but please register by mail (contact at netinfluence.ch) so that we make sure all of us can fit in the room and that we get sufficient drinks <img src='http://blog.netinfluence.com/wp-content/plugins/smilies-themer/Silk/emoticon_grin.png' alt=':D' class='wp-smiley' /> So if you want to talk about what to develop, how, what comes next and keynote impressions, join us on thursday 18th june, 18:00 at netinfluence&#8217;s office (rue marterey 1-3, lausanne)</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/06/09/event-feedback-from-the-keynote-iphone-3gs-talks/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Keynote news : new iPhone and really improved features !</title>
		<link>http://blog.netinfluence.com/2009/06/08/keynote-news-new-iphone-and-really-improved-features/</link>
		<comments>http://blog.netinfluence.com/2009/06/08/keynote-news-new-iphone-and-really-improved-features/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 18:20:00 +0000</pubDate>
		<dc:creator>sandrine</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=68</guid>
		<description><![CDATA[To make it short, the new iPhone 3G S is going to be faster (s for speed) and with a longer battery life and will come in 2 versions : 8GB (99$) &#8211; current version 16GB (199$) &#8211; 3GS 32GB (299$) &#8211; 3GS Among the new features comes : improved camera lens with auto exposure, auto focus, 3MP video capture enabled video editing from within the iPhone compas (tells you the north, south, lattitude&#8230;) lansdcape keyboard for all native apps (email, messages, notes&#8230;) MMS feature (allowing to send text &#38; pictures) Voice control to make your calls or control your iPod music launch feature to find your iPhone (makes a small alert) Number to block your iPhone in case it [...]]]></description>
			<content:encoded><![CDATA[<p>To make it short, the new iPhone 3G S is going to be faster (s for speed) and with a longer battery life and will come in 2 versions :</p>
<ul>
<li>8GB (99$) &#8211; current version</li>
<li>16GB (199$) &#8211; 3GS</li>
<li>32GB (299$) &#8211; 3GS</li>
</ul>
<p>Among the new features comes :</p>
<ul>
<li>improved camera lens with auto exposure, auto focus, 3MP</li>
<li>video capture enabled</li>
<li>video editing from within the iPhone</li>
<li>compas (tells you the north, south, lattitude&#8230;)</li>
<li>lansdcape keyboard for all native apps (email, messages, notes&#8230;)</li>
<li>MMS feature (allowing to send text &amp; pictures)</li>
<li>Voice control to make your calls or control your iPod music launch</li>
<li>feature to find your iPhone (makes a small alert)</li>
<li>Number to block your iPhone in case it gets stolen</li>
<li>Push now available : comes with 3 different possibilities &gt; sound alert, messaging of app launch</li>
<li>copy / paste and undo features available also within developers apps (comes within API)</li>
<li>more than 1&#8217;000 new APIs are available</li>
</ul>
<p>To be also noticed from the application side :</p>
<ul>
<li>more &#8220;health apps&#8221; to control your blood pressure, alert in case of patient health pb&#8230;</li>
<li>major navigation app coming with TOMTOM</li>
</ul>
<p>Figures :</p>
<ul>
<li>The iPhone has already 50&#8217;000 applications whilst android hardly got 5&#8217;000 and blackberry 1&#8217;000</li>
<li>2/3 of &#8220;phone browsing&#8221;, 65% is done by an iPhone</li>
<li>They already got more than a billion apps downloaded</li>
<li>As of april 23, they had sold 40 million iPod Touch &amp; iPhones</li>
</ul>
<p>More here : <a href="http://www.apple.com/fr/iphone/">iPhone website</a> Follow the <a href="http://www.apple.com/iphone/guidedtour/#medium">guided tour</a> (15 minutes)</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/06/08/keynote-news-new-iphone-and-really-improved-features/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10 days to get the best out of the valley!</title>
		<link>http://blog.netinfluence.com/2009/06/07/10-days-to-get-the-best-out-of-the-valley/</link>
		<comments>http://blog.netinfluence.com/2009/06/07/10-days-to-get-the-best-out-of-the-valley/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 05:27:00 +0000</pubDate>
		<dc:creator>netinfluence</dc:creator>
				<category><![CDATA[care]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[web2.0]]></category>
		<category><![CDATA[wwdc]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=72</guid>
		<description><![CDATA[This article was originally created by Marie Girardet (Left our team) Here we are! Good morning San Francisco! We dreamt of it, now here we are Two members &#8220;net-team&#8221; will be in the silicon valley for just 10 days.  Emilien is here to attend the WWDC conference while I will be wandering around, meeting people and attending a few events. Isn&#8217;t that great ? We arrived a few hours ago in the airport where we could already feel the fever of the city, and the kindness of people. On the way of our hotel, we met a nice guy, friend with the guy who developed the &#8220;iBeer&#8221; iphone application. People are great ! They talk easily and always try to [...]]]></description>
			<content:encoded><![CDATA[<p style="color: #999999; border-bottom: solid 1px #EFEFEF; margin-bottom: 20px; padding-bottom: 20px;">This article was originally created by Marie Girardet (Left our team)</p>
<p>Here we are! Good morning San Francisco! We dreamt of it, now here we are <img src='http://blog.netinfluence.com/wp-content/plugins/smilies-themer/Silk/emoticon_wink.png' alt=';-)' class='wp-smiley' /> <br />
Two members &#8220;net-team&#8221; will be in the silicon valley for just 10 days.  Emilien is here to attend the WWDC conference while I will be wandering around, meeting people and attending a few events.<br />
Isn&#8217;t that great ?</p>
<p>We arrived a few hours ago in the airport where we could already feel the fever of the city, and the kindness of people.<br />
On the way of our hotel, we met a nice guy, friend with the guy who developed the &#8220;<a hreflang="fr" href="https://hottrixdownload.com/iphone/">iBeer</a>&#8221; iphone application.<br />
People are great ! They talk easily and always try to help giving useful tricks and stuff. That&#8217;s nice to be welcome and treated like that.  I guess we should learn a lesson from this!</p>
<p>Here is the program of the week:</p>
<p>Emilien, our iphone expert is booked all week with the WWDC.<br />
In the meantime, I will try to make as many things as possible.<br />
First I&#8217;m booked for wednesday and thursday for 2 conferences :</p>
<ul>
<li>The first one is &#8220;<a hreflang="fr" href="http://influxcurated.eventbrite.com/">Influx Curated</a>&#8220;  and takes place in San Francisco.  In this event I will attend some sessions and make some networking. My objective is to meet people, create a relationship and share experiences.</li>
<li>The second event, is an <a hreflang="fr" href="http://www.forumonenetworks.com/section/unconference_faq/ocu_faq">unconference</a>, a barcamp. It takes place in Mountain View, where you have all the Google, Apple and Ebay headquarters.</li>
</ul>
<p>I hope that I will meet a lot of interesting people and attend nice sessions. I&#8217;ll try to visit a bit more of Mountain View but it is quite hard to enter Google or Apple buildings without knowing somebody working in it.( so any ideas, let me know&#8230;)</p>
<p>The rest of the week I have planned some interviews with web leaders and marketing gurus.  I am curious to find out what will be the outcome <img src='http://blog.netinfluence.com/wp-content/plugins/smilies-themer/Silk/emoticon_wink.png' alt=';-)' class='wp-smiley' /> <br />
Indeed we thought it would be interesting to talk with people working over here, in the heart of the web beat, to see how they perceived european web companies, and how they see the future, what is going to be the next big thing &#8230;</p>
<p>I will keep on sharing in the blog and of course post the ITW once they get ready.  Hope you enjoy and if you have suggestions or remarkes&#8230;do not hesitate to add your comments <img src='http://blog.netinfluence.com/wp-content/plugins/smilies-themer/Silk/emoticon_wink.png' alt=';-)' class='wp-smiley' /> </p>
<p>See you then for the next episode</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/06/07/10-days-to-get-the-best-out-of-the-valley/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UIAlertView en mode paysage</title>
		<link>http://blog.netinfluence.com/2009/05/26/uialertview-en-mode-paysage/</link>
		<comments>http://blog.netinfluence.com/2009/05/26/uialertview-en-mode-paysage/#comments</comments>
		<pubDate>Tue, 26 May 2009 07:05:00 +0000</pubDate>
		<dc:creator>netinfluence</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=67</guid>
		<description><![CDATA[This article was originally created by Emilien Vuillaume (Left our team) Si comme moi vous avez développé une application uniquement en mode paysage (bouton home à droite ou à gauche) vous avez pu noter un problème plus ou moins gênant. En effet, en utilisant une UIAlertView, celle-ci s&#8217;affichera en mode portrait ! Le problème vient du fait que l&#8217;on a défini l&#8217;orientation dans le fichier plist et que lors du chargement de l&#8217;application, l&#8217;orientation n&#8217;est pas bien reportée au niveau de la &#8220;StatusBar&#8221; de l&#8217;application. Exemple : La solution est de réaffecter la valeur d&#8217;orientation actuelle de votre iPhone ou iPod Touch à la propriété StatusBarOrientation de l&#8217;application avant d&#8217;afficher votre alerte : if([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight){   [[UIApplication sharedApplication] [...]]]></description>
			<content:encoded><![CDATA[<p style="color: #999999; border-bottom: solid 1px #EFEFEF; margin-bottom: 20px; padding-bottom: 20px;">This article was originally created by Emilien Vuillaume (Left our team)</p>
<p>Si comme moi vous avez développé une <a href="/post/2009/05/13/Application-Iphone-en-mode-paysage">application uniquement en mode paysage</a> (bouton home à droite ou à gauche) vous avez pu noter un problème plus ou moins gênant.</p>
<p>En effet, en utilisant une UIAlertView, celle-ci s&#8217;affichera en mode portrait !</p>
<p>Le problème vient du fait que l&#8217;on a défini l&#8217;orientation dans le fichier <strong>plist</strong> et que lors du chargement de l&#8217;application, l&#8217;orientation n&#8217;est pas bien reportée au niveau de la &#8220;StatusBar&#8221; de l&#8217;application.</p>
<p>Exemple :</p>
<p><img style="margin: 0pt auto; display: block; width: 366px; height: 192px;" title="alert_paysage_bug.png, mai 2009" src="/public/emilien/alert_paysage_bug.png" alt="" /></p>
<p>La solution est de réaffecter la valeur d&#8217;orientation actuelle de votre iPhone ou iPod Touch à la propriété <strong>StatusBarOrientation</strong> de l&#8217;application avant d&#8217;afficher votre alerte :</p>
<pre>if([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight){   [[UIApplication sharedApplication]                    setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft];}else{   // en mode LandscapeRight par default   [[UIApplication sharedApplication]                   setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];}

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title]                                                message:message                                               delegate:nil                                      cancelButtonTitle:@"OK"                                      otherButtonTitles:nil];

[alert show];[alert release];</pre>
<p>et voici le résultat :</p>
<p><img style="margin: 0pt auto; display: block; width: 366px; height: 192px;" title="alert_paysage_ok.png, mai 2009" src="/public/emilien/alert_paysage_ok.png" alt="" /></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/05/26/uialertview-en-mode-paysage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Une communauté iPhone très active en Suisse</title>
		<link>http://blog.netinfluence.com/2009/05/15/rencontre-de-la-communaute-iphone-en-suisse-romande/</link>
		<comments>http://blog.netinfluence.com/2009/05/15/rencontre-de-la-communaute-iphone-en-suisse-romande/#comments</comments>
		<pubDate>Fri, 15 May 2009 12:10:00 +0000</pubDate>
		<dc:creator>netinfluence</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[communauté]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[outil communautaire]]></category>
		<category><![CDATA[viral]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=66</guid>
		<description><![CDATA[This article was originally created by Emilien Vuillaume (Left our team) La 3ème réunion du groupe &#8220;Les développeurs iPhone de Suisse Romande&#8221; hier soir au sous-sol du café Le Vaudois à Lausanne à rencontré un grand succès. Le but de ce groupe, qui compte actuellement 125 membres, est tout d&#8217;abord &#8220;l&#8217;échange d&#8217;informations autour du développement iPhone, le partage d&#8217;expériences et l&#8217;organisation d&#8217;événements une fois par mois dans la région Lémanique&#8221;. Après un tour de table pour présenter tous les nouveaux arrivants, deux sujets de discussion ont été lancés : Présenté par Sébastien Hugues, le premier sujet présentait l&#8217;utilisation des services Facebook dans les applications iPhone et l&#8217;intérêt viral que cela représente. Par exemple il est très facile de publier le [...]]]></description>
			<content:encoded><![CDATA[<p style="color: #999999; border-bottom: solid 1px #EFEFEF; margin-bottom: 20px; padding-bottom: 20px;">This article was originally created by Emilien Vuillaume (Left our team)</p>
<p>La 3ème réunion du groupe &#8220;<strong>Les développeurs iPhone de Suisse Romande</strong>&#8221; hier soir au sous-sol du café <strong><em>Le Vaudois</em></strong> à <strong><em>Lausanne</em></strong> à rencontré un grand succès.</p>
<p>Le but de ce groupe,  qui compte actuellement <strong>125 membres</strong>, est tout d&#8217;abord &#8220;l&#8217;échange d&#8217;informations autour du développement iPhone, le partage d&#8217;expériences et l&#8217;organisation d&#8217;événements une fois par mois dans la région Lémanique&#8221;.</p>
<p>Après un tour de table pour présenter tous les nouveaux arrivants, deux sujets de discussion ont été lancés :</p>
<ul>
<li>Présenté par <a href="http://www.linkedin.com/in/sebastienhugues">Sébastien Hugues</a>, le premier sujet présentait l&#8217;utilisation des services <a href="http://developers.facebook.com/connect.php?tab=iphone"><strong>Facebook</strong></a> dans les applications iPhone et l&#8217;intérêt viral que cela représente.<br />
Par exemple il est très facile de publier le score de l&#8217;utilisateur sur son profil Facebook ce qui va entraîner une sorte de compétition entre les membres de son réseau et ainsi accroître rapidement la popularité de votre application.<br />
Pensez-y dans vos futurs projets et n&#8217;hésitez pas à le proposer à vos clients.</li>
<li>Le second thème, présenté par <a href="http://www.linkedin.com/pub/gilles-cherix/0/a59/175">Gilles Cherix</a>, plus technique, portait sur le choix du format d&#8217;échange des données entre deux entités (iPhone/Serveur web, iPhone/iPhone, etc&#8230;). Après une longue discussion, les deux principaux formats retenus sont le <a href="http://fr.wikipedia.org/wiki/Extensible_Markup_Language">XML</a> et le <a href="http://www.json.org/">JSON</a>. Il en ressort que la solution la plus simple est toujours la meilleure. Si votre application iPhone ou votre serveur doit intégrer une bibliothèque complexe pour utiliser le flux d&#8217;information, alors pensez à un autre format d&#8217;échange&#8230;</li>
</ul>
<p>Pour conclure cette session, nous avons fait le point sur la communication entre les membres du groupe (forum, mailing-list, etc&#8230;) ainsi que sur un possible changement de nom. Il se pourrait même qu&#8217;une application open source voit le jour!</p>
<p>Affaire à suivre&#8230;</p>
<p>Si vous êtes intéressé à nous rejoindre et à participer à nos rencontres, rejoignez le groupe Facebook : <a hreflang="fr" href="http://www.facebook.com/group.php?gid=39755092833"><strong>Les développeurs iPhone de Suisse Romande</strong></a></p>
<p>A bientôt&#8230;</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/05/15/rencontre-de-la-communaute-iphone-en-suisse-romande/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Application iPhone en mode paysage</title>
		<link>http://blog.netinfluence.com/2009/05/13/application-iphone-en-mode-paysage/</link>
		<comments>http://blog.netinfluence.com/2009/05/13/application-iphone-en-mode-paysage/#comments</comments>
		<pubDate>Wed, 13 May 2009 06:41:00 +0000</pubDate>
		<dc:creator>netinfluence</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[XCode]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=65</guid>
		<description><![CDATA[This article was originally created by Emilien Vuillaume (Left our team) Par défaut, une application est définie en mode portrait et effectue une rotation en fonction de la position de l&#8217;iPhone/iPodTouch. Cependant il peut arriver que l&#8217;on ait besoin de forcer le mode d&#8217;affichage de l&#8217;application en mode paysage et empêcher sa rotation. Plusieurs solutions existent pour définir le mode d&#8217;affichage. Par exemple, il est tout à fait possible d&#8217;effectuer une rotation de chaque vue lors de leur chargement comme j&#8217;ai déjà pu le voir&#8230; Mais cela implique plusieurs inconvénients : il est très fastidieux voir impossible de définir correctement la disposition des éléments sur la vue (label, bouton, etc&#8230;) en mode paysage à partir du visuel en mode portrait. [...]]]></description>
			<content:encoded><![CDATA[<p style="color: #999999; border-bottom: solid 1px #EFEFEF; margin-bottom: 20px; padding-bottom: 20px;">This article was originally created by Emilien Vuillaume (Left our team)</p>
<p>Par défaut, une application est définie en mode portrait et effectue une rotation en fonction de la position de l&#8217;iPhone/iPodTouch.</p>
<p>Cependant il peut arriver que l&#8217;on ait besoin de forcer le mode d&#8217;affichage de l&#8217;application en mode paysage et empêcher sa rotation.</p>
<p>Plusieurs solutions existent pour définir le mode d&#8217;affichage.<br />
Par exemple, il est tout à fait possible d&#8217;effectuer une rotation de chaque vue lors de leur chargement comme j&#8217;ai déjà pu le voir&#8230; Mais cela implique plusieurs inconvénients :</p>
<ul>
<li>il est très fastidieux voir impossible de définir correctement la disposition des éléments sur la vue (label, bouton, etc&#8230;) en mode paysage à partir du visuel en mode portrait.</li>
<li>l&#8217;application risque de manquer de fluidité et dégrader fortement l&#8217;expérience utilisateur.</li>
</ul>
<p>Une meilleure solution consiste à utiliser les directives de configuration disponible dans <strong>XCode</strong> et le <strong>SDK</strong> ainsi que d&#8217;utiliser au mieux <strong>Interface Builder</strong> (IB) :</p>
<ul>
<li><strong>Configuration</strong>
<p>Dans le fichier <strong>&#8220;.plist&#8221;</strong> de votre application, ajoutez la directive suivante :</p>
<pre>Initial interface orientation / Landscape (right home button)</pre>
<p><img title="article_plist.png, mai 2009" src="/public/emilien/.article_plist_m.jpg" alt="" /><br />
Ceci aura pour effet de lancer l&#8217;application en mode paysage dès son chargement.</li>
<li><strong>Interface Builder (IB)</strong>
<p>Créez vos interfaces directement en mode paysage.<br />
Pour faire une rotation de la vue, cliquez sur la flèche en haut à droite de la fenêtre de votre vue :</p>
<p><img title="ib_rotate.png, mai 2009" src="/public/emilien/.ib_rotate_m.jpg" alt="ici " /></li>
<li><strong>XCode</strong>
<p>Vous devez surcharger la méthode suivante dans <strong>chaque</strong> classe <em>ViewController</em> pour spécifier si l&#8217;interface doit effectuer une rotation ou non en fonction de l&#8217;orientation de votre iPhone/iPodTouch :</p>
<pre>- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{    if(interfaceOrientation == UIInterfaceOrientationLandscapeRight)	{		return YES;	}	return NO;}</pre>
</li>
</ul>
<p>Voila, votre application restera toujours en mode paysage.</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/05/13/application-iphone-en-mode-paysage/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cours iPhone dans son canapé</title>
		<link>http://blog.netinfluence.com/2009/04/21/cours-iphone-dans-son-canape/</link>
		<comments>http://blog.netinfluence.com/2009/04/21/cours-iphone-dans-son-canape/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 09:08:00 +0000</pubDate>
		<dc:creator>julien</dc:creator>
				<category><![CDATA[care]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iTunes U]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=64</guid>
		<description><![CDATA[L&#8217;iPhone vous emballe et je comprends pourquoi. Mais vous voulez aller plus loin en développant votre propre application et la voir grimper dans la classements de l&#8217;AppStore. Le seul problème, c&#8217;est qu&#8217;il faut apprendre à développer en Objective-C. Voici une solution simple : iTunes U. En effet, iTunes U permet depuis quelques semaines un accès simple à une formation sur le développement sur iPhone. Il s&#8217;agit des cours donnés aux étudiants de Stanford qui ont été enregistrés et &#8220;podcastisés&#8221; sut iTune. C&#8217;est accès est gratuit et l&#8217;enseignement de qualité, c&#8217;est Stanford tout de même&#8230; Le seul pré-requis est d&#8217;avoir un mac avec Xcode et de bonnes bases dans un langage de programmation quelconque, ensuite on s&#8217;installe et on apprend. Le [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;iPhone vous emballe et je comprends pourquoi. Mais vous voulez aller plus loin en développant votre propre application et la voir grimper dans la classements de l&#8217;AppStore. Le seul problème, c&#8217;est qu&#8217;il faut apprendre à développer en Objective-C. Voici une solution simple : <span style="font-weight: bold;">iTunes U</span>.</p>
<p>En effet, iTunes U permet depuis quelques semaines un accès simple à une formation sur le développement sur iPhone. Il s&#8217;agit des cours donnés aux étudiants de Stanford qui ont été enregistrés et &#8220;podcastisés&#8221; sut iTune. C&#8217;est accès est gratuit et l&#8217;enseignement de qualité, c&#8217;est Stanford tout de même&#8230;</p>
<p>Le seul pré-requis est d&#8217;avoir un mac avec Xcode et de bonnes bases dans un langage de programmation quelconque, ensuite on s&#8217;installe et on apprend. Le cours vient avec son site web (slides, exercices, etc).</p>
<p>Bon cours <img src='http://blog.netinfluence.com/wp-content/plugins/smilies-themer/Silk/emoticon_wink.png' alt=';-)' class='wp-smiley' /> </p>
<p><span style="font-weight: bold;">Liens :</span></p>
<p><span style="font-weight: bold;"><span style="font-weight: normal;"><a href="http://itunes.stanford.edu/">http://itunes.stanford.edu/</a><br />
<a href="http://www.stanford.edu/class/cs193p/cgi-bin/index.php">http://www.stanford.edu/class/cs193p/cgi-bin/index.php</a><br />
</span></span></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/04/21/cours-iphone-dans-son-canape/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

