<?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; apple</title>
	<atom:link href="http://blog.netinfluence.com/tag/apple/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>Steve Jobs quitte Apple, Facebook supprime deals et places, Campagne interactive d&#8217;IKEA et plus dans la weekly n°45</title>
		<link>http://blog.netinfluence.com/2011/08/30/steve-jobs-quitte-apple-weekly-n%c2%b045/</link>
		<comments>http://blog.netinfluence.com/2011/08/30/steve-jobs-quitte-apple-weekly-n%c2%b045/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 07:55:33 +0000</pubDate>
		<dc:creator>nicolas</dc:creator>
				<category><![CDATA[reach]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[deals]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[foursquare]]></category>
		<category><![CDATA[ikea]]></category>
		<category><![CDATA[Instagram]]></category>
		<category><![CDATA[places]]></category>
		<category><![CDATA[steve Jobs]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.com/?p=6896</guid>
		<description><![CDATA[iQuit: Steve Jobs quitte Apple! C&#8217;est LA nouvelle qui a ébranlée non seulement toute l&#8217;industrie, mais aussi la bourse! Co-fondateur du groupe américain d&#8217;informatique, Steve Jobs a dû lâcher les rênes de l&#8217;entreprise, mercredi 24 août. Après l&#8217;annonce de la démission du patron, l&#8217;action a chuté de 5,3 %, dans les échanges électroniques suivant la clôture de la bourse de New York. Il y a tant de choses à dire sur le patron emblématique de la marque à la pomme&#8230;.Paul Allen, cofondateur, avec Bill Gates, de Microsoft, éternel rival d&#8217;Apple a salué en Steve Jobs &#8220;l&#8217;un des plus grands innovateurs de notre industrie&#8221;. Quoiqu&#8217;il en soit la transition à la tête d&#8217;Apple était en préparation depuis de nombreux mois. C&#8217;est [...]]]></description>
			<content:encoded><![CDATA[<p><strong>iQuit: Steve Jobs quitte Apple!</strong></p>
<p>C&#8217;est LA nouvelle qui a ébranlée non seulement toute l&#8217;industrie, mais aussi la bourse!<br />
Co-fondateur du groupe américain d&#8217;informatique, Steve Jobs a dû lâcher les rênes de l&#8217;entreprise, mercredi 24 août. Après l&#8217;annonce de la démission du patron, l&#8217;action a chuté de 5,3 %, dans les échanges électroniques suivant la clôture de la bourse de New York.<br />
Il y a tant de choses à dire sur le patron emblématique de la marque à la pomme&#8230;.Paul Allen, cofondateur, avec Bill Gates, de Microsoft, éternel rival d&#8217;Apple a salué en Steve Jobs &#8220;l&#8217;un des plus grands innovateurs de notre industrie&#8221;.<br />
Quoiqu&#8217;il en soit la transition à la tête d&#8217;Apple était en préparation depuis de nombreux mois. C&#8217;est Tim Cook qui reprend les rênes, alors que Steve reste au conseil d&#8217;administration.</p>
<p>Voici 2 vidéos emblématiques de Steve Jobs:<br />
la démonstration du Macintosh en 1984 et la présentation de l&#8217;iPad en 2010</p>
<p><iframe width="560" height="450" src="http://www.youtube.com/embed/G0FtgZNOD44" frameborder="0" allowfullscreen></iframe></p>
<p><iframe width="560" height="345" src="http://www.youtube.com/embed/OBhYxj2SvRI" frameborder="0" allowfullscreen></iframe></p>
<p><strong>Mieux contrôler avec qui vous partager sur Facebook</strong></p>
<p>La fonctionnalité &#8220;Circles&#8221; de Google+ a sûrement donné du fil à retordre à Facebook qui <a href="https://blog.facebook.com/blog.php?post=10150251867797131">annonce sur son blog</a> plein d&#8217;amélioration concernant le réglage des paramètres de confidentialité et le contrôle de qui voit quoi sur votre profil. Ces règlages se font de plus directement depuis votre profil!</p>
<p><iframe width="560" height="345" src="http://www.youtube.com/embed/a6Ca9V56BY0" frameborder="0" allowfullscreen></iframe></p>
<p><strong>Facebook supprime &#8220;Deals&#8221; et révise &#8220;Places&#8221;</strong></p>
<p>&#8220;Après avoir testé Deals pendant quatre mois, nous avons décidé de mettre fin à ce produit dans les semaines à venir&#8221;, a indiqué le réseau social Facebook pour annoncer  qu&#8217;il <a href="http://www.allfacebook.com/news-flash-facebook-is-getting-rid-of-deals-2011-08">mettait un terme</a> à son service de réductions sur des achats groupés, calqué sur ce que proposent des sites comme Groupon ou LivingSocial. Son service Deals avait été lancé en avril de manière expérimentale dans cinq villes américaines, notamment à Atlanta et San Francisco. </p>
<p><img src="http://blog.netinfluence.com/wp-content/uploads/2011/08/weekly45_2.jpg" alt="" title="weekly45_2" width="560" height="382" class="alignnone size-full wp-image-6911" /></p>
<p>Concernant &#8220;Places&#8221;, que tous les observateurs avaient vu comme un Foursquare killer, il change drastiquement de positionnement. En effet, Facebook ne <a href="http://www.facebook.com/about/location">limite plus la géolocalisation au&#8221;check-in&#8221; sur un lieu</a>, au contraire il intègre la fonctionnalité au coeur du système pour permettre aux utilisateurs d&#8217;indiquer:<br />
- Où vous vous trouviez. Rappelez-vous d’où vous vous trouviez dans vos photos préférées.<br />
- Où vous vous trouvez maintenant. Des amis qui se trouvent à proximité pourraient vous rencontrer.<br />
- Où vous allez. Les amis qui y sont déjà allés peuvent vous donner des conseils ou même vous y retrouver.<br />
Et ceci depuis un smartphone ou un ordinateur!</p>
<p><iframe width="560" height="345" src="http://www.youtube.com/embed/CAEFhu1eZSA" frameborder="0" allowfullscreen></iframe></p>
<p><strong>Facebook améliore encore l&#8217;affichage des photos et annonce un Instagram-killer</strong></p>
<p>Avec plus de 250 millions de photos téléchargées, chaque jour, le partage d&#8217;images est l&#8217;une des activités les plus populaires sur Facebook.<br />
Facebook a donc apporté de nouvelles améliorations touchant notamment la taille &#8211; elle passe de 720 à 960 pixels &#8211; et le chargement plus rapide des photos.<br />
Facebook prend d&#8217;ailleurs les photos très à coeur en annoncant à la vue du <a href="http://www.digitalbuzzblog.com/infographic-instagram-facts/">succès fulgurant de l&#8217;application de partage de photos Instagram</a>, le <a href="http://bits.blogs.nytimes.com/2011/08/24/facebook-targets-instagram-with-photo-filters/">lancement de sa propre application</a>, &#8220;copier-coller&#8221; d&#8217;Instagram avec une douzaine de filtres et des fonctionnalités proches.</p>
<p><strong>Happy to bed: la campagne YouTube interactive d&#8217;Ikea</strong></p>
<p>Ikea vient de lancer une campagne interactive au Royaume-Uni sur YouTube autour de son univers literie. L&#8217;originalité de la campagne est qu&#8217;elle intègre Facebook Connect dans YouTube pour personnaliser encore plus l&#8217;interaction. <a href="http://www.youtube.com/user/ikeauk">A découvrir absolument</a>!</p>
<p><iframe width="560" height="345" src="http://www.youtube.com/embed/hQYe7OMoJNA" frameborder="0" allowfullscreen></iframe></p>
<p><strong>Orangina célèbre ses 75 ans avec une application Facebook baptisée &#8220;Show your Original&#8221;</strong></p>
<p>Pour fêter ses 75 ans, Orangina a développé une application Facebook afin de permettre à ses fans de (re)découvrir les 10 personnes avec lesquelles ils ont été, en premier, en contact sur le réseau social.<br />
L&#8217;application <a href="http://www.facebook.com/OranginaInternational?sk=app_255620891123325">&#8220;Show Your Originals&#8221;</a> permet ensuite d&#8217;enregistrer ou de partager le résultat avec ses &#8220;original friends&#8221;!</p>
<p><img src="http://blog.netinfluence.com/wp-content/uploads/2011/08/weekly45_3.jpg" alt="" title="weekly45_3" width="458" height="620" class="alignnone size-full wp-image-6918" /></p>
<p><strong>L&#8217;historique des Social Media</strong></p>
<p>Toujours pratique d&#8217;avoir ce <a href="http://www.mofo.com/sociallyaware/">petit rappel historique</a> sous la main!</p>
<p><img src="http://blog.netinfluence.com/wp-content/uploads/2011/08/weekly45_SM.jpg" alt="" title="weekly45_SM" width="560" height="703" class="alignnone size-full wp-image-6900" /></p>
<p><strong>LA vidéo virale de la semaine</strong></p>
<p>Cette semaine c&#8217;est le club de foot espagnol Getafe qui remporte la palme avec ce clip qui a fait le tour du web: une campagne pour recruter de nouveaux fans exploitant ce qui marche le mieux avec humour: le sexe!<br />
Et oui le club invite ses supporters à donner du sperme pour créer plus de supporters!</p>
<p><iframe width="560" height="345" src="http://www.youtube.com/embed/4hcjjRgvnDo" frameborder="0" allowfullscreen></iframe></p>
<p><strong>Pour être sûr de ne pas manquer ce rendez-vous hebdomadaire et recevoir notre Weekly Review chaque semaine directement dans votre inbox, inscrivez-vous à notre liste e-mailing &#8220;Weekly Review by netinfluence&#8221; en utilisant le formulaire ci-dessous:</strong></p>
<form id="subForm" action="http://netmailing.netinfluence.com/t/r/s/ohdjru/" method="post"><label for="name">Name:</label></p>
<input id="name" name="cm-name" type="text" /><label for="ohdjru-ohdjru">Email:</label></p>
<input id="ohdjru-ohdjru" name="cm-ohdjru-ohdjru" type="text" />
<input type="submit" value="Subscribe" /> </form>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2011/08/30/steve-jobs-quitte-apple-weekly-n%c2%b045/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les nouveautés iOS5</title>
		<link>http://blog.netinfluence.com/2011/06/08/les-nouveautes-ios5/</link>
		<comments>http://blog.netinfluence.com/2011/06/08/les-nouveautes-ios5/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 09:36:28 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[steve Jobs]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.com/?p=5284</guid>
		<description><![CDATA[Apple a posté la vidéo de démonstration de son nouvel Operating System présenté par Steve Jobs lundi après midi Parmi les grandes nouveautés: la possibilité d’utiliser son iPad ou son iPhone sans le relier à un ordinateur. De nombreuses fonctionnalités ont aussi fait leur apparition: un système amélioré de gestion des notifications (notifications center), un kiosque à journaux personnel (newstand), une fonctionnalité de lecture différée sous Safari (Reading list), un gestionnaire de tâches ( Reminders), un usage simplifié de l’appareil photo, une nouvelle version du game center et bien d&#8217;autres améliorations. Apple a aussi présenté iCloud, un système gratuit qui conservera vos données dans le &#8220;Cloud” et sera accessibles depuis tous types d&#8217;appareils conectés au web. La gestion de vos [...]]]></description>
			<content:encoded><![CDATA[<p>Apple a posté la vidéo de démonstration de son nouvel Operating System présenté par Steve Jobs lundi après midi Parmi les grandes nouveautés: la possibilité d’utiliser son iPad ou son iPhone sans le relier à un ordinateur.  </p>
<p>De nombreuses fonctionnalités ont aussi fait leur apparition: un système amélioré de gestion des notifications (notifications center), un kiosque à journaux personnel (newstand), une fonctionnalité de lecture différée sous Safari (Reading list), un gestionnaire de tâches ( Reminders), un usage simplifié de l’appareil photo, une nouvelle version du game center et bien d&#8217;autres améliorations.</p>
<p>Apple a aussi présenté iCloud, un système gratuit qui conservera vos données dans le &#8220;Cloud” et sera accessibles depuis tous types d&#8217;appareils conectés au web. La gestion de vos documents se fera à la manière de dropbox. </p>
<p>Pour les plus photographes parmi vous, photostream conservera vos photos dans le Cloud et permettra de voir immédiatement vos photos sur votre téléviseur via Apple TV. </p>
<p>Votre bibliothèque iTunes sera aussi dans le &#8220;Cloud”, en attendant l&#8217;arrivée de <a href="http://www.youtube.com/watch?v=zYANRyLubTs">iTunes Match</a>, qui permettra d&#8217;accéder à 18 millions de chansons pour moins de 25$. </p>
<p><iframe width="560" height="349" src="http://www.youtube.com/embed/0iq5floqW3s" frameborder="0" allowfullscreen></iframe></p>
<p><a href="http://www.nicolasbordas.fr/">via</a></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2011/06/08/les-nouveautes-ios5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>La campagne de Google pour Chrome, KLM veut votre portrait, les dernières statistiques de géolocalisation et plus dans notre Weekly Review n°36</title>
		<link>http://blog.netinfluence.com/2011/05/09/la-campagne-de-google-pour-chrome-klm-veut-votre-portrait-les-derniere-statistiques-de-geolocalisation-et-plus-dans-notre-weekly-n%c2%b036/</link>
		<comments>http://blog.netinfluence.com/2011/05/09/la-campagne-de-google-pour-chrome-klm-veut-votre-portrait-les-derniere-statistiques-de-geolocalisation-et-plus-dans-notre-weekly-n%c2%b036/#comments</comments>
		<pubDate>Mon, 09 May 2011 14:52:27 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[reach]]></category>
		<category><![CDATA[Affichage interactif]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[Ben & Jerry's]]></category>
		<category><![CDATA[consomation numerique en france]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[facebook deals]]></category>
		<category><![CDATA[Fanta]]></category>
		<category><![CDATA[geolocalisation]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[KLM]]></category>
		<category><![CDATA[loterie romande]]></category>
		<category><![CDATA[Park]]></category>
		<category><![CDATA[Skype]]></category>
		<category><![CDATA[Veet]]></category>
		<category><![CDATA[Weekly Review]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.com/?p=4859</guid>
		<description><![CDATA[Les publicités pour Google Chrome Google a lancé la semaine dernière une série de spots publicitaires émouvants. Cette campagne de spots est la plus grosse campagne publicitaire offline commanditée par Google jusqu’à présent. En tout cas, suite à leur diffusion, ces spots sont très vite devenus viraux. Voici la première vidéo appelée «Dear Sophie». Le deuxième spot, intitulé &#8220;It gets better&#8221;, est en fait une compilation des meilleurs vidéos de la chaîne YouTube «It gets better project». Cette chaîne a été lancée par Dan Savage afin de soutenir les jeunes gays et lesbiennes mis au banc par la société pour leur orientation sexuelle. De nombreuses stars ont participé à ce projet, tel Adam Lambert, Lady Gaga, Kathy Griffin ou encore [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Les publicités pour Google Chrome</strong></p>
<p>Google a lancé la semaine dernière une série de spots publicitaires émouvants. Cette campagne de spots est la plus grosse campagne publicitaire offline commanditée par Google jusqu’à présent. En tout cas, suite à leur diffusion, ces spots sont très vite devenus viraux. Voici la première vidéo appelée «Dear Sophie».</p>
<p>Le deuxième spot, intitulé &#8220;It gets better&#8221;, est en fait une compilation des meilleurs vidéos de la chaîne YouTube «<a href="http://www.youtube.com/user/itgetsbetterproject">It gets better project</a>». Cette chaîne a été lancée par Dan Savage afin de soutenir les  jeunes gays et lesbiennes mis au banc par la société pour leur orientation sexuelle. De nombreuses stars ont participé à ce projet, tel Adam Lambert, Lady Gaga, Kathy Griffin ou encore Woody de Toy Story&#8230; Voici le résultat.</p>
<p><strong>Votre portrait sur un avion KLM</strong></p>
<p>Avec les réseaux sociaux KLM est, comme toutes les marques, en perpétuelle recherche de fans.<br />
Porsche l’a fait il y a quelques mois en gravant le nom de ses fans sur un de ses modèles, KLM a aussi voulu se lancer dans l’aventure en imprimant le portrait de ses fans sur son avion. <a href="http://www.facebook.com/KLM?sk=app_191034310940191">Une application Facebook</a> vous permet de vous tirer le portrait en bleu de Delf avant de bientôt voir votre profil sur un avion KLM qui parcoura le monde.</p>
<p><strong>Veet et «monminoutoutdoux»</strong></p>
<p>Le buzz négatif de la semaine aura surement été celui de Veet, qui s’est fait démolir par les différentes réactions sur Internet suite au lancement de sa campagne &#8220;minoutoutdoux&#8221;. Ils ont de ce fait décidé de la suspendre. Veet a expliqué à l’Express qu’ils ont «préféré ne laisser aucune place à l’ambiguité». Cette campagne, dont le site monminoutoutdoux a été supprimé, était en fait «un test» pour créer le buzz.<br />
Je vous laisse apprécier la vidéo Youtube, à défaut du site&#8230;</p>
<p><strong>Ben Laden dans une publicité de sécurité routière</strong></p>
<p>Les publicités surfant sur l&#8217;actualité sont généralement bien reprises par un public web friand de détournements. C&#8217;était par exemple le cas du <a href="http://www.youtube.com/watch?v=Kav0FEhtLug">mariage princier</a>, repris par T- mobile. Ici, on trouve la réponse à la question: Pourquoi Ben Laden a-t-il été jeté en mer? Ce n&#8217;est ni pour des raisons de sécurité d&#8217;état, ni pour empêcher que son tombeau ne devienne un lieu de pélérinage, ni pour une toute autre raison expliquée par la presse. La vraie raison, la voici.</p>
<p><strong>Loterie Romande: la première campagne d’affichage interactive de Suisse Romande</strong></p>
<p>La Loterie Romande lance une nouvelle campagne de publicité pour « Le mois de la chance » avec les célèbres « têtes à claques ».</p>
<p>C’est en en partenariat avec la SGA et avec le soutien de ses agences que la Loterie Romande est devenue le premier annonceur romand à utiliser l’application Poster Plus dans une campagne d’affichage.</p>
<p>Le but est de télécharger l’application gratuitement sur son iPhone et de photographier l’affiche pour accéder aux vidéos exclusives des « têtes à claques ». Retrouvez les  <a href="http://live.loro.ch">ici</a>.</p>
<p><strong>Ben &amp; Jerry’s: des tweets équitables</strong></p>
<p>Ben &amp; Jerry&#8217;s a lancé la semaine dernière une campagne sociale sur Twitter pour rappeler l’importance du <a href="http://www.wftday.org/">World fair trade day</a> ( la journée mondiale du commerce équitable). Appelée Fair Tweets, la campagne se sert des caractères inutilisés de votre compte twitter pour y intégrer un message publicitaire en faveur le World fair trade day. Sympa non?</p>
<p><strong>Fanta: créez votre parc</strong></p>
<p>Fanta propose aux internautes de construire leurs propres parcs d’attractions et d’y inviter tous leurs amis pour tester les 8 attractions différentes.</p>
<p>Avec « <a href="http://apps.facebook.com/king-of-the-park/?code=t5apTFJkzwpTlT1v6N6SJGMDqUsn6iOs_GcUcZcWAo8.eyJpdiI6IlYtaXZaamlrWnRKNEZja2FtX0w3encifQ.41ckOqoJepf6OE1JaNmV1w4OaIarWvUxgTzFFrBRf8p4SpNT-QTRgXtuIbWmu6by5z4WVqc9WSbBIikT7I3qGIdrMqX7N1zYa9MNzqOP-fmUBWpAV7SmxVVGHxXYw4Cao5nzQPwTMxvD0lUlno1UOA">King of the Park</a> » , il s’agit de défier ses amis, pour avoir la possibilité de gagner chaque semaine des places pour un parc d’attractions bien réel. L’internaute qui sera élu THE KING à la fin de l’opération gagnera un séjour VIP avec 3 de ses amis .</p>
<p><strong>Facebook vous paiera pour que vous regardiez certaines publicités</strong></p>
<p>Facebook a prévu d’encourager les consommateurs a regarder certaines de leurs publicités. Comment? En récompensant les utilisateurs par un paiement qui sera d’en moyenne 10 centimes le visionnage. Ils pourront utiliser cet argent en Facebook credits pour acheter des bonus sur les jeux présents sur la plateforme, mais aussi en profiter sur Facebook Deals.</p>
<p>Ces publicités se trouveront principalement dans les jeux de Crowdestar, Digital Chocolate et Zinga. Pour le CEO de sharethrough, ca y est, «on s’éloigne de la publicité interruptrice».</p>
<p><strong>Facebook veut racheter Skype</strong></p>
<p>Facebook voudrait racheter Skype pour une valeur de 3 à 4 milliards $. Skype et Facebook s’étaient déjà rapprochés octobre dernier afin de permettre de chater et d’appeler ses amis directement depuis Facebook. Mais Facebook n’est pas le seul à vouloir acheter Skype: Google aussi serait en train de négocier&#8230;</p>
<p><strong>Apple: l’entreprise qui a le plus de valeur</strong></p>
<p>La valeur d’Apple a augmeté de 84% cette année grâce à outils sans fils tels le iphone 4 et les 2 ipads, mais aussi grace a leur desktops et laptops. Apple est donc l&#8217;entreprise qui a le plus de valeur, avec 153.3 milliards de dollars. Derrières Apple, viennent s’installer Google avec 111.5 milliards suivis de IBM avec 100.850 milliards.</p>
<p><img class="alignnone size-full wp-image-4888" title="Capture d’écran 2011-05-09 à 11.39.55" src="http://blog.netinfluence.com/wp-content/uploads/2011/05/Capture-d’écran-2011-05-09-à-11.39.551.png" alt="" width="429" height="275" /></p>
<p><strong>La consommation numérique en France</strong></p>
<p>54 % des français interrogés privilégient l&#8217;écran d&#8217;ordinateur comme support pour télécharger et regarder des vidéos.</p>
<p>C&#8217;est ce que révèle la dernière étude trimestrielle sur le comportement des français en matière de consommation de contenus numériques réalisée par l&#8217;Institut Gfk et l&#8217;AFP.</p>
<p><img class="alignleft size-full wp-image-4880" title="Capture d’écran 2011-05-09 à 12.00.21" src="http://blog.netinfluence.com/wp-content/uploads/2011/05/Capture-d’écran-2011-05-09-à-12.00.21.png" alt="" width="500" height="375" /></p>
<p>Retrouvez l&#8217;étude complète <a href="http://www.observatoiredeswebtv.com/wp-content/uploads/downloads/2011/05/barom__tre_num__rique_rec_vague3_gfk_afp.pdf&lt;br &gt;&lt;/a&gt; http://www.observatoiredeswebtv.com/wp-content/uploads/downloads/2011/05/barom__tre_num__rique_rec_vague3_gfk_afp.pdf">ici</a>.</p>
<p><strong>17% des possesseurs de mobiles se géolocalisent</strong></p>
<p>Les principales raisons pour lesquelles les utilisateurs n’utilisent pas une application de géolocalisation sont que 50% des personnes interrogées n’ont pas de smartphones, 49% n’en voit pas l’intéret et 48% sont inquiets de la circulation de leurs données privées.<br />
- Ceux qui se géolocalisent utilisent à 90% Facebook Places, 31% Twitter, 30% Groupon, 22% Foursquare<br />
- 54% de personnes qui se géolocalisent se disent motivés par les réductions, ils ne sont que 21% à vouloir des badges et autres récompenses du style.</p>
<p><a href="http://7.mshcdn.com/wp-content/uploads/2011/05/social_loco_infographic.jpg" rel="lightbox[4859]" title="social_loco_infographic-681x1024"><img class="alignnone size-medium wp-image-4881" title="social_loco_infographic-681x1024" src="http://blog.netinfluence.com/wp-content/uploads/2011/05/social_loco_infographic-681x1024-199x300.jpg" alt="" width="199" height="300" /></a><br />
(cliquer pour agrandir)</p>
<p><strong>Anniversaire de mariage</strong></p>
<p>Sean Ohlenkamp, un directeur artistique de Toronto a décidé de créer un joli cadeau d&#8217;anniversaire pour sa femme&#8230; Je vous laisse découvrir LA vidéo de la semaine.</p>
<p><strong>Pour être sûr de ne pas manquer ce rendez-vous hebdomadaire et recevoir notre Weekly Review chaque semaine directement dans votre  inbox, inscrivez-vous à notre liste e-mailing &#8220;Weekly Review by netinfluence&#8221; en utilisant le formulaire ci-dessous:</strong></p>
<form id="subForm" action="http://netmailing.netinfluence.com/t/r/s/ohdjru/" method="post">
<div>
<p><label for="name">Name:</label></p>
<input id="name" name="cm-name" type="text" /><label for="ohdjru-ohdjru">Email:</label></p>
<input id="ohdjru-ohdjru" name="cm-ohdjru-ohdjru" type="text" />
<input type="submit" value="Subscribe" /></div>
</form>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2011/05/09/la-campagne-de-google-pour-chrome-klm-veut-votre-portrait-les-derniere-statistiques-de-geolocalisation-et-plus-dans-notre-weekly-n%c2%b036/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les nouveaux Skittles bleus, le bouton “send” de Facebook, Facebook Studio et bien plus dans notre Weekly Review n°34!</title>
		<link>http://blog.netinfluence.com/2011/04/27/les-nouveaux-skittles-bleus-le-bouton-send-de-facebook-facebook-studio-et-bien-plus-dans-notre-weekly-review-n%c2%b034/</link>
		<comments>http://blog.netinfluence.com/2011/04/27/les-nouveaux-skittles-bleus-le-bouton-send-de-facebook-facebook-studio-et-bien-plus-dans-notre-weekly-review-n%c2%b034/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 12:23:24 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[reach]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[facebook credits]]></category>
		<category><![CDATA[Facebook Studio]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[groupon]]></category>
		<category><![CDATA[Lady Gaga]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[LivingSocial]]></category>
		<category><![CDATA[OldSpice]]></category>
		<category><![CDATA[Skittles]]></category>
		<category><![CDATA[social consumer]]></category>
		<category><![CDATA[Spotify]]></category>
		<category><![CDATA[Volkswagen]]></category>
		<category><![CDATA[Weekly Review]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.com/?p=4684</guid>
		<description><![CDATA[Les nouveaux Skittles bleus Commençons norte Weekly avec cette superbe campagne de Skittles. Celle-ci concerne le tout nouveau Blue Skittles et s’est déroulée tout au long de la semaine dernière. Après avoir partagé sur leur page Facebook des images de sa chaine de production en République Tchèque, Skittles a proposé aux internautes d’accompagner la première livraison des Skittles bleus en Angleterre et en temps réel. Mais le chauffeur tchèque n&#8217;a décidé d&#8217;avancer que s&#8217;il se sentait aimé et ne continuait donc sa livraison que si les internautes se mobilisaient pour l’encourager par leurs commentaires et leurs &#8220;likes&#8221; sur le mur Facebook. Lady Gaga cherche son assistant(e) d&#8217;un jour Lady Gaga sera l&#8217;invitée du quotidien gratuit Metro et travaillera en tant [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Les nouveaux Skittles bleus</strong></p>
<p>Commençons norte Weekly avec cette superbe campagne de Skittles.  Celle-ci concerne le tout nouveau Blue Skittles et s’est déroulée tout au long de la semaine dernière.</p>
<p>Après avoir partagé sur leur <a href="http://www.facebook.com/skittles.uk">page Facebook</a> des images de sa chaine de production en République Tchèque, Skittles a proposé aux internautes d’accompagner la première livraison des Skittles bleus en Angleterre et en temps réel.</p>
<p>Mais le chauffeur tchèque n&#8217;a décidé d&#8217;avancer que s&#8217;il se sentait aimé et ne continuait donc sa livraison que si les internautes se mobilisaient pour l’encourager par leurs commentaires et leurs &#8220;likes&#8221; sur le mur Facebook.</p>
<p><strong>Lady Gaga cherche son assistant(e) d&#8217;un jour</strong></p>
<p>Lady Gaga sera l&#8217;invitée du quotidien gratuit Metro et travaillera en tant que rédactrice en chef  le 17 mai prochain pour une édition très spéciale du journal. Metro cherche donc l&#8217;assistant(e) qui aura la chance et le privilège de pouvoir assister la chanteuse dans sa tâche. Comment? Tout simplement en lui parlant <a href="http://ladygagametro.com/">du but de votre vie</a>.</p>
<p><strong>Old Spice change de visage</strong></p>
<p>Pour le marché international, la marque renouvelle sa communication avec comme thème: les dangers rencontrés dans la forêt vierge. Ils auront au passage remis l&#8217;ancien Old Spice Guy dans le placard pour le remplacer par une nouvelle égérie, habillée comme un prince pour affronter la jungle et que nous vous laissons découvrir.</p>
<p><strong>La campagne Volkswagen sur LinkedIn</strong></p>
<p>La campagne LinkedIn de Volkswagen en Hollande, appelée &#8220;LinkUit&#8221; donne la chance à celui qui défie un de ses contacts LinkedIn de gagner une Volkwagen Passat. Le but est tout simplement d&#8217;avoir le plus puissant des profils de Hollande. Une fois que vous vous connectez sur le site, l&#8217;application vous permet de défier une relation sur l&#8217;éducation, l&#8217;expérience, les recommandations et les connections.</p>
<p><a href="http://vimeo.com/22884874">Volkswagen Linkeduit</a> from <a href="http://vimeo.com/user5110107">Fethi Uluak</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><strong>LE mariage royale sur YouTube</strong></p>
<p>La retransmission du mariage Royale débutera le <a href="http://www.youtube.com/user/TheRoyalChannel">vendredi 29 avril à 10h sur YouTube et la chaîne royale</a>. Il «couvrira la procession du mariage, la cérémonie à l’Abbaye de Westminster et le baiser des jeunes époux sur le balcon. En plus de la retransmission en direct, la chaîne Royale proposera des commentaires écrits et partagera informations et témoignages tout au long de la journée» selon Google.</p>
<p><strong>Facebook lance le nouveau bouton &#8220;Send&#8221;</strong></p>
<p>Un nouveau bouton fera son apparition sur les sites à côté du bouton &#8220;like&#8221;: <a href="http://developers.facebook.com/blog/post/494">le bouton &#8220;Send&#8221;</a>. Il servira à partager le contenu d&#8217;un site au sein d&#8217;un groupe, de vos amis ou n&#8217;importe quelle adresse e-mail. Là où le bouton like vous permettait de rapidement partager le contenu d&#8217;un site avec tous vos amis, le bouton send vous permet d&#8217;en sélectionner quelque-uns.</p>
<p><img class="alignnone size-full wp-image-4688" title="Bouton send" src="http://blog.netinfluence.com/wp-content/uploads/2011/04/Bouton-send.jpeg" alt="" width="468" height="282" /></p>
<p><strong>Facebook Studio</strong></p>
<p>Cette semaine, Facebook a créé une plateforme communautaire pour les marketeurs et les créatifs: <a href="http://facebook-studio.com/site/index">Facebook Studio</a> . Le but de cette plateforme est de mettre en place une relation solide et durable avec les agences de publicité et les encourager à se dépasser sur cette plateforme.</p>
<p>Il est important pour les créatifs et marketeurs de pouvoir s&#8217;inspirer d&#8217;exemples concrets qui ont conduit au succès d&#8217;une campagne. Ils pourront d&#8217;ailleurs eux même à voter pour la campagne Facebook qui les aura le plus marqué. Celles qui auront le plus de votes pourront participer au <a href="http://facebook-studio.com/awards/index">Facebook Awards</a>.</p>
<p><img class="alignnone size-full wp-image-4714" title="facebook studio" src="http://blog.netinfluence.com/wp-content/uploads/2011/04/facebook-studio.png" alt="" width="600" height="354" /></p>
<p><strong>Des cartes Facebook Credits prépayées vendues en magasin</strong></p>
<p><a href="http://lexpansion.lexpress.fr/high-tech/aucun-site-de-e-commerce-n-a-su-tirer-parti-de-facebook-en-europe_252865.html%22%3E">Facebook France</a> annonçait en début de semaine dernière que les &#8220;Facebook Crédits&#8221; allaient faire leur apparition dès le 1er Juillet sous la forme de cartes prépayées. Ceci a notamment pour but de booster le secteur du jeu mais aussi l&#8217;achat de vidéos en ligne.</p>
<p>Facebook déclare au passage que, malheureusement, aucun site européen de e-commerce n&#8217;a réussi à tirer profit de sa plateforme. Il encourage donc ces sites à intégrer leur site sur Facebook via le F-commerce.</p>
<p><strong>Facebook lance son concurrent à Groupon</strong></p>
<p>Le réseau social Facebook a aussi lancé son service d&#8217;achat groupé à la Groupon, dans les villes d&#8217;Atlanta, Austin, Dallas, San Diego et San Francisco. La guerre est donc ouverte entre Facebook, Groupon et LivingSocial.</p>
<p>Mais le plus intéressant, c&#8217;est que, <a href="http://bits.blogs.nytimes.com/2011/04/25/facebook-is-latest-rival-to-groupon-livingsocial-facebook/">selon le New York Times</a>, Facebook veut utiliser ce nouveau service pour étendre l&#8217;usage de sa monnaie virtuelle&#8230;</p>
<p><strong>La musique en ligne: Google vs Apple vs Amazon</strong></p>
<p>Apple, Google, mais aussi Amazon, veulent chacun proposer des services musicaux permettant d&#8217;accéder à des morceaux musicaux depuis internet.</p>
<p>Apple serait donc en passe de signer des accords avec au moins deux des quatre majors du disque. Amazon a quant à lui lancé fin mars un service de stockage et de lecture de musique en ligne baptisé Cloud Drive, mais a maintenant des problèmes avec Sony music concernant les droits d&#8217;auteur. Google serait, pendant ce temps, en train de réfléchir pour racheter Spotify.</p>
<p><strong>Fearsquare</strong></p>
<p>Un nouveau réseau social a fait son apparition au Royaume Uni. Appelé <a href="http://fearsquare.com/">Fearsquare</a>, ce réseau permet à l&#8217;internaute de découvrir le nombre et la nature des crimes commis dans le moi dans les lieux qu&#8217;il fréquente. La police anglaise veut ainsi évaluer ces données personnalisées pour savoir si elles influent sur la peur du crime et sur les comportements des gens enversw ces lieus.</p>
<p><strong>Le consommateur social?</strong></p>
<p>Qui est le consommateur social? Qui est-il et qu&#8217;attend-il de votre marque? Voici un &#8220;infographic&#8221; qui vous aidera a le comprendre un peu mieux.</p>
<p><img class="alignnone size-full wp-image-4693" title="evolution du CRM sicial" src="http://blog.netinfluence.com/wp-content/uploads/2011/04/evolution-du-CRM-sicial.png" alt="" width="570" height="2326" /></p>
<p><strong>Le grand saut en slow motion</strong></p>
<p>De superbes plans dans cette vidéo mettant en scène de nombreux sauts en chute libre et filmés en slow-motion. Produite par Betty Wants In pour le Melbourne Skydrive Centre, c&#8217;est LA vidéo de la semaine.</p>
<p><a href="http://vimeo.com/22428395">Experience Human Flight</a> from <a href="http://vimeo.com/bettywantsin">Betty Wants In</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><strong>Pour être sûr de ne pas manquer ce rendez-vous hebdomadaire et recevoir notre Weekly Review chaque semaine directement dans votre  inbox, inscrivez-vous à notre liste e-mailing &#8220;Weekly Review by netinfluence&#8221; en utilisant le formulaire ci-dessous:</strong></p>
<form id="subForm" action="http://netmailing.netinfluence.com/t/r/s/ohdjru/" method="post">
<div>
<p><label for="name">Name:</label></p>
<input id="name" name="cm-name" type="text" /><label for="ohdjru-ohdjru">Email:</label></p>
<input id="ohdjru-ohdjru" name="cm-ohdjru-ohdjru" type="text" />
<input type="submit" value="Subscribe" /></div>
</form>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2011/04/27/les-nouveaux-skittles-bleus-le-bouton-send-de-facebook-facebook-studio-et-bien-plus-dans-notre-weekly-review-n%c2%b034/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Guy Kawasaki et Brian Solis sur l’art de l’enchantement</title>
		<link>http://blog.netinfluence.com/2011/03/31/guy-kawasaki-et-brian-solis-sur-lart-de-lenchantement/</link>
		<comments>http://blog.netinfluence.com/2011/03/31/guy-kawasaki-et-brian-solis-sur-lart-de-lenchantement/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 12:29:13 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[think]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[at&t]]></category>
		<category><![CDATA[brian solis]]></category>
		<category><![CDATA[guy kawasaki]]></category>
		<category><![CDATA[social media marketing]]></category>
		<category><![CDATA[virgin airline]]></category>
		<category><![CDATA[zappos]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.com/?p=4336</guid>
		<description><![CDATA[Comment &#8220;enchanter&#8221; vos clients et quels sont les exemples à suivre? Brian Solis interview Guy Kawasaki à propos de son dernier livre &#8220;Enchantement&#8220;. Que retenir de cette interview? Mis à part qu’il va falloir lire son livre, Guy nous explique que l’enchantement, c’est d’abord une émotion. Trois choses permettent d&#8217;enchanter les clients: Être aimable, être fiable et enfin, avoir de supers produits. Il est extrêmement difficile d’avoir ces trois piliers en même temps dans une entreprise mais une fois acquis, l&#8217;entreprise est sûre d&#8217;avoir un succès éclatant. Par exemple, Virgin excelle dans l’amabilité, à l’image de son CEO. Zappos est la fiabilité incarnée, notamment en garantissant le retour gratuit de ses chaussures si elles ne satisfont pas le consommateur. Apple [...]]]></description>
			<content:encoded><![CDATA[<p>Comment &#8220;enchanter&#8221; vos clients et quels sont les exemples à suivre? <a href="http://blog.netinfluence.com/2011/02/10/lift11-video-interview-with-brian-solis-what-is-social-web-changing/">Brian Solis</a> interview <a href="http://www.guykawasaki.com/about/">Guy Kawasaki</a> à propos de son dernier livre &#8220;<a href="http://www.guykawasaki.com/enchantment/">Enchantement</a>&#8220;.</p>
<p><iframe title="YouTube video player" width="560" height="336" src="http://www.youtube.com/embed/jxt_xZJcAEg" frameborder="0" allowfullscreen></iframe></p>
<p>Que retenir de cette interview? Mis à part qu’il va falloir lire son livre, Guy nous explique que <strong>l’enchantement, c’est d’abord une émotion</strong>. </p>
<p>Trois choses permettent d&#8217;enchanter les clients: <strong>Être aimable, être fiable et enfin, avoir de supers produits</strong>. Il est extrêmement difficile d’avoir ces trois piliers en même temps dans une entreprise mais une fois acquis, l&#8217;entreprise est sûre d&#8217;avoir un succès éclatant. </p>
<p>Par exemple, Virgin excelle dans l’amabilité, à <a href="http://www.youtube.com/embed/3cqqOfqXlMo">l’image de son CEO</a>. Zappos est la fiabilité incarnée, notamment en garantissant le retour gratuit de ses chaussures si elles ne satisfont pas le consommateur. Apple quant à lui, brille par la qualité de ses produits.</p>
<p><strong>Apple</strong></p>
<p>Apple est d’ailleurs un exemple spécial du marketing 2.0. Apple n&#8217;est pas social, pour ne pas dire anti-social. On en a eu <a href="http://www.fastcompany.com/1621516/iphone-leak-iphone-4-apple-gizmodo">la preuve</a> avec la perte du prototype du iPhone 4 peu avant sa sortie. Cependant, Brian Solis constate que malgré cette non-socialisation de la marque, Apple reste très social, non par sa communication, mais au travers de ses produits. </p>
<p>Nous sommes tellement enchantés par les produits, le packaging et la manière dont on l’ouvre pour découvrir ce produit, que nous devenons naturellement ambassadeurs. Tout vient de l’expérience époustouflante qu&#8217;Apple nous procure. </p>
<p>Si les produits sont une extension de &#8220;qui nous sommes&#8221;, <strong>les media sociaux nous permettent de partager ce que nous sommes et consommons</strong>, de nous sentir «meilleurs», plus confiants et aussi un peu plus &#8220;enchantants&#8221;. Pour Brian, plutôt que le produit, c&#8217;est ce point qui serait le principal pilier d’Apple, même si pour Guy ayant longtemps travaillé pour Apple, cette notion n&#8217;était nullement prévue par l&#8217;entreprise.</p>
<p><strong>Zappos</strong></p>
<p>C’est différent de <a href="http://www.zappos.com/">Zappos</a> qui, dans ses stocks, n’a effectivement pas toutes les chaussures de l’univers; on pourrait aisément trouver d’autres sites avec un choix de chaussures plus grand. Mais là n’est pas <a href="http://www.youtube.com/watch?v=79t_imZyP40">le problème</a>. Zappos: excelle dans son service et jusqu’aux <a href="http://www.youtube.com/watch?v=uo3sMaH-h9M&#038;feature=related">moindres détails</a>. Si une personne ne trouve pas la paire qu’elle veut, elle peut toujours en prendre une autre. Si elle ne lui plait pas, elle peux toujours la renvoyer aux frais de Zappos. Tout est fait pour véritablement enchanter le client au niveau du service. D&#8217;ailleurs le moto de Zappos n&#8217;est autre que &#8220;delivering happiness&#8221;!</p>
<p><iframe title="YouTube video player" width="560" height="336" src="http://www.youtube.com/embed/i7mzCjraJeA" frameborder="0" allowfullscreen></iframe></p>
<p><strong>Pourquoi enchanter vos clients?</strong></p>
<p>Comment savoir si une marque nous a enchanté? Posez vous la question de savoir <strong>si vous seriez prêt à pardonner quelques faiblesses et manquements de la part d’une marque</strong>. Prenez Apple par exemple. Si oui, c&#8217;est que vous êtes sous le charme. </p>
<p>D&#8217;ailleurs, pourquoi même se poser la question? C&#8217;est simple: <strong>suite à la démocratisation de l’information grâce à internet, il y a eu une égalisation de l’influence</strong>. C’est une nouvelle ère ou le &#8220;leadership&#8221; doit être mérité, que ce soit la plus grosse ou la plus petite des organisations. D&#8217;ailleurs, la manière dont nos deux amis cassent <a href="http://www.att.com/">at&#038;t</a> en est le parfait exemple.</p>
<p>Le marketing tel qu’on l’a connu, <a href="http://blog.netinfluence.com/2011/03/23/comment-les-medias-sociaux-changent-notre-maniere-de-communiquer/">a été inversé</a>. Avant, il y avait les «grands»: revues, journaux etc. qui avaient beaucoup de visibilité et qui étaient souvent considéré comme l&#8217;autorité ultime. </p>
<p>Ceux-ci parlaient à la masse des consommateurs en leur disant: &#8220;faites nous confiance, nous savons ce qui est bon pour vous&#8221;. Le nouveau marketing fonctionne différemment: c’est le client seul qui décide et celui-ci ne fait majoritairement confiance qu’à ses pairs. C&#8217;est, entre autre, un des rôles des médias sociaux. </p>
<p>Et vous, votre marque enchante-t-elle vos clients?</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2011/03/31/guy-kawasaki-et-brian-solis-sur-lart-de-lenchantement/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Le retour de l’iPad, la plateforme de commentaires de facebook, l’animal de compagnie de Zuckerberg et plein d’autres news dans cette Weekly Review n°27</title>
		<link>http://blog.netinfluence.com/2011/03/07/le-retour-de-lipad-la-plateforme-de-commentaires-de-facebook-lanimal-de-compagnie-de-zukerberg-et-pleins-dautres-news-dans-cette-weekly-review-n%c2%b027/</link>
		<comments>http://blog.netinfluence.com/2011/03/07/le-retour-de-lipad-la-plateforme-de-commentaires-de-facebook-lanimal-de-compagnie-de-zukerberg-et-pleins-dautres-news-dans-cette-weekly-review-n%c2%b027/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 13:25:54 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[reach]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[f-commerce]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[Facebook comments]]></category>
		<category><![CDATA[foursquare]]></category>
		<category><![CDATA[groupon]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[steve Jobs]]></category>
		<category><![CDATA[Weekly Review]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.com/?p=3865</guid>
		<description><![CDATA[Bienvenue à la weekly review par netinfluence! Suivez-nous sur Facebook ou Twitter pour du &#8220;temps réel&#8221; mais sinon comme chaque semaine, retrouvez sur notre blog, notre tour d’horizon de l’actualité web 2.0 et techno de la semaine écoulée! Pour être sûr de ne pas manquer ce rendez-vous hebdomadaire et recevoir notre Weekly Review chaque semaine directement dans votre inbox, inscrivez-vous à notre liste e-mailing &#8220;Weekly Review by netinfluence&#8221; en utilisant le formulaire ci-dessous: Name: Email: iPad : le retour Hello ! Nous allons commencer notre weekly avec la présentation du ipad 2nd du nom. Sa sortie est prévue pour le 11 mars 2011 aux US et pour le 25 en Europe. Cette tablette sera beaucoup plus puissante que la première, [...]]]></description>
			<content:encoded><![CDATA[<p>Bienvenue à la weekly review par netinfluence!<br />
Suivez-nous sur <a href="http://www.facebook.com/netinfluence.ch?ref=ts">Facebook</a> ou <a href="http://twitter.com/netinfluence">Twitter</a> pour du &#8220;temps réel&#8221; mais sinon comme chaque semaine, retrouvez sur notre blog, notre tour d’horizon de l’actualité web 2.0 et techno de la  semaine écoulée!<br />
<strong>Pour être sûr de ne pas manquer ce rendez-vous hebdomadaire et  recevoir notre Weekly Review chaque semaine directement dans votre  inbox, inscrivez-vous à notre liste e-mailing &#8220;Weekly Review by  netinfluence&#8221; en utilisant le formulaire ci-dessous:</strong></p>
<p><label for="name">Name:</label></p>
<input id="name" name="cm-name" type="text" />
<p><label for="ohdjru-ohdjru">Email:</label></p>
<input id="ohdjru-ohdjru" name="cm-ohdjru-ohdjru" type="text" />
<p><strong>iPad : le retour</strong></p>
<p>Hello ! Nous allons commencer notre weekly avec la présentation du ipad 2nd du nom. Sa sortie est prévue pour le 11 mars 2011 aux US et pour le 25 en Europe.</p>
<p>Cette tablette sera beaucoup plus puissante que la première, aura deux caméras et et un gyroscope. Elle sera aussi plus légère et plus fine d’un tiers que sa prédécesseur; encore plus fine que le iphone 4. La batterie quant à elle aura toujours une longévité de 10 heures.</p>
<p>Le prix ne variera pas non plus du premier iPad, c’est à dire 499 pour un 16 giga. N’oublions pas non plus qu’il existe plus de 65&#8217;000 applications adaptées à l’iPad… Tout est fait pour démocratiser l&#8217;expérience digitale!</p>
<p>Voici la vidéo complète de la présentation :</p>
<p>En tout cas <a href="http://www.emarketer.com/ ">e-marketer </a>s’attend à ce qu’Apple rafle 78% du marché des tablettes avec 34 millions d’unités vendues.</p>
<p><strong>Facebook comments</strong></p>
<p>Sinon Facebook veut encore grandir et lance donc un module de commentaire : &#8220;Facebook comments&#8221;.</p>
<p>Celui-ci veut concurrencer les plateformes de commentaires de WordPress et autres CMS. Ce module s&#8217;insère en bas de votre article et vous permet de commenter avec votre identité Facebook, en même temps qu&#8217;il vous propose de reposter automatiquement votre commentaire sur votre mur Facebook.</p>
<p>Par la suite, si un de vos amis commente votre commentaire sur votre mur, ce commentaire sera ajouté aux commentaires en bas d&#8217;article, récupéré du module &#8220;Facebook comments&#8221;.</p>
<p><img class="alignnone size-full wp-image-3866" title="Capture d’écran 2011-03-07 à 11.20.04" src="http://blog.netinfluence.com/wp-content/uploads/2011/03/Capture-d’écran-2011-03-07-à-11.20.04.png" alt="" width="539" height="246" /></p>
<p><strong>La page de l’animal de compagnie de Zuckerberg</strong></p>
<p>Pendant ce temps, Mark Zuckerberg a décidé d’ouvrir une page pour son chien, ou l’on voit <a href="https://www.facebook.com/beast.the.dog">Beast</a> avec ses maîtres.</p>
<p>L’animal a même pensé à mettre à jour son status : &#8220;Now living in my new home in Palo Alto with Mark Zuckerberg and Priscilla Chan&#8221;.</p>
<p>Ses centres d’intérêt principaux sont &#8220;Cuddling, Loving and Eating&#8221; (faire des câlins, aimer et manger)</p>
<p><strong>Facebook, c’est bon pour le moral</strong></p>
<p>D’ailleurs, une étude de la Cornell University a été faite sur 63 personnes afin de mesurer l’effet que facebook avait sur eux.</p>
<p>Ils ont  fait s’assoire certains devant un ordinateur, d’autres devant un miroir et les derniers devant leur page facebook. Et vous savez quoi ? Ceux qui sont resté devant facebook voyaient leur amour propre grimper en flèche, spécialmenent ceux qui avaient mis leur profils à jour…</p>
<p>Et la recherche de conclure : &#8220;Contrairement au miroir qui nous rappelle qui nous sommes vraiment, et qui peut avoir un effet négatif sur l&#8217;amour propre si cette image ne colle pas avec notre idéal, facebook peut montrer des cotés positif de notre personne.&#8221;</p>
<p><strong>La position du Cincinnati Enquirer</strong></p>
<p><a href="http://news.cincinnati.com/section/NEWS">Cincinnati Enquirer</a>, un quotidien américain, lance un service de géolocalisation inspiré de Foursquare qui capitalise sur ses archives et sa connaissance du marché local. Appelé <a href="http://local.cincinnati.com/porkappolis/">Porkappolis</a>, l&#8217;application propose comme fouresquare de faire des check-in et de gagner des badges.</p>
<p>Le journal propose d’ajouter ses propres connaissances et documentations de la région au service de géolocalisation, en plus de demander aux gens leur participation. Joli coup de la part du journal qui en profite au passage pour ne pas se laisser oublier des commerçant locaux auxquels ils proposent de la publicité.</p>
<p><img class="alignnone size-full wp-image-3870" title="porkappolis-checkin-illus-screens-thumb-450x133-29259" src="http://blog.netinfluence.com/wp-content/uploads/2011/03/porkappolis-checkin-illus-screens-thumb-450x133-29259.jpg" alt="" width="450" height="133" /></p>
<p>Et en bonus, voici un slideshare sur le future de la géolocalisation</p>
<div id="__ss_6463289" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a title="The Future of Check ins" href="http://www.slideshare.net/peburns/the-future-of-check-ins">The Future of Check ins</a></strong> <object id="__sse6463289" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" 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://static.slidesharecdn.com/swf/ssplayer2.swf?doc=thefutureofcheck-ins-110105214344-phpapp02&amp;stripped_title=the-future-of-check-ins&amp;userName=peburns" /><param name="name" value="__sse6463289" /><param name="allowfullscreen" value="true" /><embed id="__sse6463289" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=thefutureofcheck-ins-110105214344-phpapp02&amp;stripped_title=the-future-of-check-ins&amp;userName=peburns" name="__sse6463289" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more presentations from <a href="http://www.slideshare.net/peburns">DASH7 Alliance</a></div>
</div>
<p><strong>Sur le F-commerce</strong></p>
<p>L’ agence digitale <a href="http://www.creativefeed.net/">Creativefeed</a> nous a préparé le premier info-graphique concernant le domaine émergeant du f-commerce.</p>
<p><img class="alignnone size-full wp-image-3871" title="CF_Social_FCommerce_infograph_FEB28_forblog-e1299342663622" src="http://blog.netinfluence.com/wp-content/uploads/2011/03/CF_Social_FCommerce_infograph_FEB28_forblog-e1299342663622.jpg" alt="" width="570" height="1186" /></p>
<p><strong>Groupon multiplie son chiffre d’affaire mais&#8230;</strong></p>
<p>Après deux ans d’existence, la firme basée à Chicago est devenue la nouvelle coqueluche du Web avec un chiffre d’affaire qui s&#8217;est multiplié par 20 en un an. Cependant, malgré une entrée en Chine remarquée via le site <a href="http://www.gaopeng.com">Gaopeng.com</a>, le site craint ses concurrents.</p>
<p>Les spécialistes pensent en effet que le site sera incapable de garder 50% de part de marché comme il le fait aux USA. En même temps il existe déjà quelques 200 concurrents aux Etats-Unis et 500 dans le monde.</p>
<p>Côté finances, Groupon pourrait être introduit en bourse fin 2011 ou en 2012. La société avait levé 950 millions de dollars début 2010 et sa valeur actuelle serait de quelque 15 milliards de dollars.</p>
<p><strong>L’appli d’AXA</strong></p>
<p>A part ca, <a href="http://www.axa.com/fr/">Axa </a>nous a lancé une joli publicité avec un concept intéressant d’intégration online et offline.</p>
<p><strong>Mais pourquoi est-il aussi cool ?</strong></p>
<p>Et puis on a enfin décidé de nous dévoiler pourquoi et comment le Old Spice Guy faisait pour être aussi cool.</p>
<p><strong>L’évolution rêvée des chats</strong></p>
<p>Et pour finir, LA vidéo de la semaine avec, comme héros principaux, des chats qui ne sont pas dénués d’habilité :</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2011/03/07/le-retour-de-lipad-la-plateforme-de-commentaires-de-facebook-lanimal-de-compagnie-de-zukerberg-et-pleins-dautres-news-dans-cette-weekly-review-n%c2%b027/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tipp-Ex créé le buzz, Ping, Zappos au pays des merveilles et plus dans notre Weekly Review n°8</title>
		<link>http://blog.netinfluence.com/2010/09/06/netinfluence%e2%80%99s-weekly-review-n%c2%b08/</link>
		<comments>http://blog.netinfluence.com/2010/09/06/netinfluence%e2%80%99s-weekly-review-n%c2%b08/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 07:30:21 +0000</pubDate>
		<dc:creator>nicolas</dc:creator>
				<category><![CDATA[reach]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[Tipp-Ex]]></category>
		<category><![CDATA[Weekly Review]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.com/?p=2423</guid>
		<description><![CDATA[Tipp-Ex créé le buzz sur YouTube Plusieurs vidéos ont fait le buzz cette semaine et nous en avons relayé sur notre Fanpage. Il y a bien sur eu le coup magique de Federer à L&#8217;US Open, le flashmob de la SNCF, mais la campagne la plus &#8220;hot right now&#8221; est celle de Tipp-Ex. On vous laisse (re)découvrir tout ça et surtout tester tout plein de scénari&#8230;.Drive, love, party, dance, eat&#8230;même kill est drôle! Essayer &#8220;f*ck&#8221; à tout hasard&#8230;bande de vilains! Apple et Google à l&#8217;assaut du petit écran Mercredi dernier, Apple a donné un nouveau coup de boost à son Apple TV en rabaissant le prix à 99 dollars contre environ 250 dollars (pour la version 160 Go). L&#8217;Apple TV [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Tipp-Ex créé le buzz sur YouTube</strong></p>
<p>Plusieurs vidéos ont fait le buzz cette semaine et nous en avons relayé sur notre <a href="http://www.facebook.com/netinfluence.ch">Fanpage</a>. Il y a bien sur eu le coup magique de Federer à L&#8217;US Open, le flashmob de la SNCF, mais la campagne la plus &#8220;hot right now&#8221; est celle de Tipp-Ex. On vous laisse (re)découvrir tout ça et surtout <a href="http://www.youtube.com/watch?v=4ba1BqJ4S2M&amp;feature=player_embedded">tester tout plein de scénari</a>&#8230;.Drive, love, party, dance, eat&#8230;même kill est drôle! Essayer &#8220;f*ck&#8221; à tout hasard&#8230;bande de vilains!</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="560" height="335" 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/4ba1BqJ4S2M?fs=1&amp;hl=fr_FR" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="560" height="335" src="http://www.youtube.com/v/4ba1BqJ4S2M?fs=1&amp;hl=fr_FR" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><strong>Apple et Google à l&#8217;assaut du petit écran</strong></p>
<p>Mercredi dernier, Apple a donné un nouveau coup de boost à son Apple TV en rabaissant le prix à 99 dollars contre environ 250 dollars (pour la version 160 Go). L&#8217;Apple TV gagne également en compacité puisqu&#8217;il n&#8217;est à présent pas plus gros qu&#8217;un iPhone. Il permet d&#8217;accéder à un catalogue de 7 000 films en vidéo à la demande. Google se lance lui aussi dans la bataille, car dans les semaines qui viennent commenceront à être commercialisées les &#8220;Google TV&#8221;. Il s&#8217;agit de téléviseurs connectés à l&#8217;Internet sur l&#8217;écran desquels il sera possible de naviguer, via le moteur de recherche Google, entre une multitude de contenus audiovisuels différentscomme YouTube, Facebook, Twitter, et des offres de VaD!</p>
<p><strong>Apple sans Facebook sur Ping</strong></p>
<p>A l&#8217;image de Pandora ou Last.fm, Ping, lancé par Apple le 31 août, est un réseau social dédié à la musique destiné à faire découvrir de nouveaux groupes à ses utilisateurs, en se basant sur les recommandations de l&#8217;ensemble des utilisateurs.  Il devait initialement comporter une intégration avec Facebook, mais un désaccord entre les deux entreprises a poussé Apple à supprimer cette fonctionnalité juste après le lancement. L&#8217;API de Facebook est normalement gratuite, mais les services l&#8217;utilisant à grande échelle doivent obtenir un accord préalable. Facebook et Apple n&#8217;ont pas réussi à se mettre d&#8217;accord.</p>
<p><strong>Zappos au pays des merveilles!</strong></p>
<p>Zappos cultive sa réputation d&#8217;entreprise proche de ses clients et centrée sur la qualité de service. C&#8217;est l&#8217;une des compagnies avec le plus d&#8217;employés actifs sur <a href="http://twitter.zappos.com/">Twitter</a>.<br />
Voici leur vidéo, Zappos Family Music Video, ca vous donne pas envie d&#8217;aller bosser là-bas..ou rejoindre les bisounours vous? <img src='http://blog.netinfluence.com/wp-content/plugins/smilies-themer/Silk/emoticon_wink.png' alt=';)' class='wp-smiley' /> </p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="560" height="335" 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/4gHlEBU_NSg?fs=1&amp;hl=fr_FR" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="560" height="335" src="http://www.youtube.com/v/4gHlEBU_NSg?fs=1&amp;hl=fr_FR" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><strong>Tous contre l&#8217;iPad!</strong></p>
<p>Les concurrents d&#8217;Apple sortent enfin leurs tablettes! Samsung, Toshiba et Archos ont révélé leurs produits la semaine passée lors du salon IFA de Berlin. Microsoft et HP sont attendus au tournant.</p>
<p><strong>Scion en réalité augmentée</strong></p>
<p>L&#8217;AR devient de plus en plus utilisée pour la promotion de produits. Vous avez peut-être déjà testé les approches de Tissot, Ray-ban, Adidas ou Burger King&#8230;Toyota s&#8217;y colle pour sa marque Scion. Il s&#8217;agit ici d&#8217;un jeu. Pour guider la voiture sur le circuit, vous devez simplement imprimer un volant qui contient un marqueur. Allez hop c&#8217;est parti pour un tour de circuit! Pas mal pour présenter les produits de la marque de manière interactive, ludique et presque réelle!</p>
<p><a href="http://vimeo.com/14393938">Overview of Scion tC &#8220;Take On the Machine&#8221; Augmented Reality Game</a> from <a href="http://vimeo.com/attik">ATTIK</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p><strong>Gmail introduit la boîte de réception prioritaire</strong></p>
<p><em>&#8220;Le courrier électronique, c&#8217;est génial&#8230; sauf quand il y a trop de messages. La boîte de réception prioritaire identifie et filtre automatiquement vos messages importants : désormais, vous pouvez vous concentrer sur l&#8217;essentiel.&#8221;</em> Voilà le message qui accompagne le lancement de la <a href="http://mail.google.com/mail/help/priority-inbox.html">boîte de réception prioritaire par Gmail</a>.<br />
Les e-mails sont classés automatiquement en fonction de la priorité de leurs expéditeurs. Plus ils vous ont contacté auparavant, plus leur score augmente; si vous leur avez déjà répondu leur score augmente d’avantage.<br />
Grâce à ce systême, vous devriez passer 16% de temps en moins à lire vos e-mails, selon Google! Explications vidéo:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="560" height="335" 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/5nt3gE9dGHQ?fs=1&amp;hl=fr_FR" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="560" height="335" src="http://www.youtube.com/v/5nt3gE9dGHQ?fs=1&amp;hl=fr_FR" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><strong>Le nouveau Chrome est arrivé!</strong></p>
<p>Pour célébrer les deux ans de son navigateur, Google a lancé une sixième version de Chrome: &#8220;Chrome est maintenant trois fois plus rapide qu&#8217;il ne l&#8217;était il y a deux ans&#8221;, assure le groupe américain, sur son <a href="http://chrome.blogspot.com/2010/09/back-to-future-two-years-of-google.html">blog</a>.<br />
Chrome est le troisième navigateur le plus utilisé par les internautes, et représente 7,52 % du marché, derrière Internet Explorer (60,40 %) et Firefox (22,93 %).</p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2010/09/06/netinfluence%e2%80%99s-weekly-review-n%c2%b08/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les 10 ans d&#8217;ebookers, 500 millions pour Facebook, la crise de l&#8217;iPhone 4 etplus dans notre Weekly Review n°2</title>
		<link>http://blog.netinfluence.com/2010/07/26/netinfluence%e2%80%99s-weekly-review-n%c2%b02/</link>
		<comments>http://blog.netinfluence.com/2010/07/26/netinfluence%e2%80%99s-weekly-review-n%c2%b02/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 06:30:05 +0000</pubDate>
		<dc:creator>nicolas</dc:creator>
				<category><![CDATA[reach]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[ebookers]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[iphone4]]></category>
		<category><![CDATA[vente-privée]]></category>
		<category><![CDATA[Weekly Review]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=2124</guid>
		<description><![CDATA[ebookers fête ses 10 ans avec le concours dixansdevacances.ch Exemple intéressant de campagne UGC qui s&#8217;est déroulée en Suisse ces dernières semaines, dixansdevacances.ch par ebookers vous permettait de soumettre vos vidéos ou photos, originales et créatives pour espérer gagner un voyage d&#8217;une valeur de 50&#8217;000CHF pendant 10 ans. Avec un prix aussi attractif, les participations ont été très nombreuses. Gagnants annoncés d&#8217;ici la fin du mois de Juillet! Facebook annonce 500 millions d&#8217;utilisateurs! Si facebook était un pays, ce serait le 3ème plus peuplé au monde! C&#8217;est par un billet publié le 21 juillet sur son blog que le fondateur de facebook, Mark Zukerberg, a annoncé que le service comptait désormais 500 millions d&#8217;utilisateurs actifs. Pour célébrer cette étape importante, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>ebookers fête ses 10 ans avec le concours dixansdevacances.ch</strong></p>
<p>Exemple intéressant de campagne UGC qui s&#8217;est déroulée en Suisse ces dernières semaines, <a href="http://www.dixansdevacances.ch">dixansdevacances.ch</a> par ebookers vous permettait de soumettre vos vidéos ou photos, originales et créatives pour espérer gagner un voyage d&#8217;une valeur de 50&#8217;000CHF pendant 10 ans. Avec un prix aussi attractif, les participations ont été très nombreuses. Gagnants annoncés d&#8217;ici la fin du mois de Juillet!</p>
<p><strong>Facebook annonce 500 millions d&#8217;utilisateurs!</strong></p>
<p>Si facebook était un pays, ce serait le 3ème plus peuplé au monde! C&#8217;est par un <a href="http://blog.facebook.com/blog.php?post=409753352130">billet</a> publié le 21 juillet sur son blog que le fondateur de facebook, Mark Zukerberg, a annoncé que le service comptait désormais 500 millions d&#8217;utilisateurs actifs. Pour célébrer cette étape importante, 6 ans seulement après sa création, facebook a lancé l&#8217;application <a href="http://stories.facebook.com/">facebook stories</a> et invite tous les utilisateurs à partager leurs &#8220;histoires&#8221;. Zukerberg a également donné une <a href="http://abcnews.go.com/WN/zuckerberg-calls-movie-fiction-disputes-signing-contract-giving/story?id=11217015">interview</a> sur la chaîne américaine ABC depuis le HQ de facebook.</p>
<p><strong>Apple gère la crise de l&#8217;iPhone 4</strong></p>
<p>Steve Jobs s&#8217;est adressé à la presse pour présenter la position d&#8217;Apple par rapport à la crise de réception de l&#8217;iPhone4.</p>
<p>« Nous pensons que l’histoire est hors de proportion. C’est rigolo quand  il se passe quelque chose mais ça ne l’est pas pour ceux qui sont de  l’autre côté. Et donc, voici ce que nous allons faire pour que nos  utilisateurs soient heureux. Premièrement, il y a la mise à jour  logicielle (d’iOS4 en 4.0.1) qui règle le problème d’affichage des  barres et d’autres bugs. Elle est maintenant disponible. Et puis, les  gens disent que le Bumper règle tous les problèmes. Ils nous demandent : « pourquoi n’en  donnez-vous pas un à tout le monde ? » OK. Nous allons vous donner un  étui gratuit. Un étui gratuit pour chaque acheteur d’iPhone 4. Si vous  en avez déjà acheté un, nous vous le rembourserons. Nous allons donc  vous envoyer un étui gratuitement. Malheureusement, nous ne pouvons pas  fabriquer suffisamment de Bumpers. Impossible d’ici la fin du trimestre.  Nous allons donc proposer une sélection d’étuis et vous donner le  choix ».<br />
Tous les propriétaires d&#8217;iPhone4 recevront donc un étui gratuit pour résoudre les problème de réception. Une opération qui coutera 180 millions de dollars à Apple ce qui devrait légèrement affecté les bénéfices record s&#8217;élevant à $5.7 milliard sur 2009.<strong><br />
</strong></p>
<p><strong>&#8220;Un jour dans la vie&#8221; sur Youtube<br />
</strong></p>
<p>Avez-vous déjà filmé et publié  un moment de votre choix dans le cadre du projet «<a href="http://www.youtube.com/lifeinaday">Life in a  day</a>» lancé par <a href="http://googleblog.blogspot.com/2010/07/life-in-day.html">Google </a>sur Youtube? «Life in a  day» est un expérience inédite visant à créer un film à partir de vidéos réalisées par des internautes dumonde entier. Le résultat sera un documentaire unique produit par Ridley Scott et réalisé par  Kevin Mac Donald. L’avant-première du documentaire complet sera présentée lors du  Sundance Film Festival, en janvier 2011. L&#8217;ensemble des contributions transmises seront en outre publiées sur <a href="http://www.youtube.com/lifeinaday">Youtube</a>.</p>
<p><strong>Vente-privée révèle les chiffres de son application m-commerce</strong></p>
<p>Dans une <a href="http://www.journaldunet.com/ebusiness/internet-mobile/jacques-antoine-granjon-application-iphone-vente-privee.shtml">interview</a> donnée au JDN, Jacques-Antoine Granjon, fondateur et PDG de Vente-privée, a fait un premier bilan des ventes sur mobile suite au lancement de leur application transactionnelle. L&#8217;application lancée il y a un mois a déjà été téléchargée plus de 335 000 fois. Elle  représente 1,5 million de visites pour environ 80 000 visiteurs  quotidiens pour 18 millions de pages vues. Près de trois semaines après son lancement, l&#8217;application  transactionnelle a directement généré un chiffre d&#8217;affaires de  515 000 euros pour près de 10 000 commandes.</p>
<p><strong>What the F**k is Social Media NOW?</strong></p>
<p>Après <a href="http://www.slideshare.net/mzkagan/what-the-fk-social-media">What  The F**K is Social Media?</a> et <a href="http://www.slideshare.net/mzkagan/what-the-fk-is-social-media-one-year-later">What  the F**K is Social Media: One Year Later</a>, voici la dernière mise à jour: What the F**k is Social Media NOW? Ces célèbres présentations vulgarisent ce que sont les médias sociaux. Dans cette mise à jour, Marta Kagan, se concentre au-delà des chiffres sur la manière dont les médias sociaux ont évolué! Impressionnant!</p>
<div id="__ss_4747637" style="width: 560px;"><strong style="display: block; margin: 12px 0 4px;"><a title="What the F**k is Social Media NOW?" href="http://www.slideshare.net/mzkagan/what-the-fk-is-social-media-now-4747637">What the F**k is Social Media NOW?</a></strong><object id="__sse4747637" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="560" height="465" 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://static.slidesharecdn.com/swf/ssplayer2.swf?doc=wtfissocialmediayr3-100713150130-phpapp01&amp;stripped_title=what-the-fk-is-social-media-now-4747637" /><param name="name" value="__sse4747637" /><param name="allowfullscreen" value="true" /><embed id="__sse4747637" type="application/x-shockwave-flash" width="560" height="465" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=wtfissocialmediayr3-100713150130-phpapp01&amp;stripped_title=what-the-fk-is-social-media-now-4747637" name="__sse4747637" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/mzkagan">Marta Kagan</a>.</div>
<div style="padding: 5px 0 12px;"><strong>Pepsi surf sur l&#8217;actualité</strong></div>
<div style="padding: 5px 0 12px;">Belle récupération de l&#8217;agence BBDO qui a sorti cette pub.  Beau coup de buzz!</div>
<div style="padding: 5px 0 12px;">
<div id="attachment_2139" class="wp-caption alignleft" style="width: 463px"><a href="http://adsoftheworld.com/media/print/pepsi_paul"><img class="size-full wp-image-2139" title="Campagne Pepsi par BBDO" src="http://blog.netinfluence.ch/wp-content/uploads/2010/07/PEPSI-PAUL.preview.jpg" alt="" width="453" height="590" /></a><p class="wp-caption-text">Campagne Pepsi par BBDO</p></div>
</div>
</div>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2010/07/26/netinfluence%e2%80%99s-weekly-review-n%c2%b02/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Foursquare: un réseau social au service de votre business!</title>
		<link>http://blog.netinfluence.com/2010/07/02/foursquare-un-reseau-social-au-service-de-votre-business/</link>
		<comments>http://blog.netinfluence.com/2010/07/02/foursquare-un-reseau-social-au-service-de-votre-business/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 13:46:50 +0000</pubDate>
		<dc:creator>nicolas</dc:creator>
				<category><![CDATA[reach]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[com.geek]]></category>
		<category><![CDATA[Cominmag]]></category>
		<category><![CDATA[Domino's Pizza]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[foursquare]]></category>
		<category><![CDATA[Starbucks]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=1975</guid>
		<description><![CDATA[Retrouvez ci-dessous ma chronique com.geek parue dans Cominmag, le magazine du marketing, de la communication et des médias en Suisse romande, de Juillet/Août 2010: La notion de ROI sur les réseaux sociaux, comme Facebook ou Twitter, reste souvent flou pour les marques. Avec Foursquare et les autres services de géolocalisation, la donne change. Enfin un réseau social aux opportunités commerciales évidentes! Avec la démocratisation des Smartphones, les mondes virtuels et réels sont en train de fusionner et Foursquare est au premier plan de cette évolution. En effet, si Twitter vous permettait originellement de répondre à la question « Quʼest ce que je fais?», Foursquare, lui, vous permet en temps réel de dire où vous êtes, mais aussi de découvrir quels [...]]]></description>
			<content:encoded><![CDATA[<p>Retrouvez ci-dessous ma chronique <strong>com.geek</strong> parue dans <a href="http://www.cominmag.ch/mag/foursquare/" target="_blank">Cominmag</a>, le magazine du marketing, de la communication et des médias en Suisse romande, de Juillet/Août 2010:</p>
<p><strong>La notion de ROI sur les réseaux sociaux, comme Facebook ou Twitter, reste souvent flou pour les marques. Avec Foursquare et les autres services de géolocalisation, la donne change. Enfin un réseau social aux opportunités commerciales évidentes!</strong></p>
<p>Avec la démocratisation des Smartphones, les mondes virtuels et réels sont en train de fusionner et Foursquare est au premier plan de cette évolution. En effet, si Twitter vous permettait originellement de répondre à la question « Quʼest ce que je fais?», Foursquare, lui, vous permet en temps réel de dire où vous êtes, mais aussi de découvrir quels amis se trouvent au même endroit que vous, et quelles sont les bonnes affaires à saisir dans le périmètre où vous vous situez.</p>
<p>En combinant les dimensions de réseau social, du city guide et du gaming, le service de géolocalisation a su séduire un million dʼutilisateurs à travers le monde en une année d’existence seulement, et enregistre plus de 10 « check-in » par seconde!</p>
<p><strong>Et pour les professionnels alors?</strong></p>
<p>Après des campagnes « tests » pour de gros annonceurs nord-américains, comme Apple ou Starbucks qui possédent leurs propres badges à débloquer dans l’application en visitant plusieurs points de vente, Foursquare propose à présent une batterie dʼoutils mis à disposition des marques et des commerces de toutes tailles.</p>
<p>Ainsi, que ce soit Dominoʼs Pizza qui récompense au Royaume-Uni le « mayor » de chacun de ses restaurants avec une pizza gratuite hebdomadaire, ou Point G à Montréal qui offre un macaron à tous ses clients effectuant leur premier « check-in » dans la boutique, tous deux bénéficient des mêmes outils pour valoriser leurs clientèles fidèles mais aussi augmenter la fréquentation de leurs points de vente.</p>
<p>Si votre commerce est inscrit sur le service, il est également très facile de créer des promotions ou « Foursquare Special »: comme lʼapplication localise les personnes qui s’enregistrent à proximité de votre point de vente, elle peut instantanément les informer sur une promotion contextuelle proposée chez vous. Foursquare permet ainsi de toucher une cible très qualifiée et de générer du flux en magasin.</p>
<p>Le service sʼest doté dernièrement dʼun système dʼanalyses de données très avancé qui permet aux professionnels de suivre et analyser des informations précises sur le comportement de leurs clients: nombre de « check-in » sur une période donnée et heure de ceux-ci, ratio homme/femme, taux de diffusion vers Facebook et/ou Twitter, classement des visiteurs. Foursquare annonce aussi lʼintégration de données météorologiques pour mesurer lʼimpact du climat sur la fréquentation des points de vente. Dans ce contexte, la mise en place dʼun programme de fidélisation via Foursquare peut sʼavérer encore plus puissant.</p>
<p><strong>Enfin une application pour les geeks qui offre une opportunité incontournable de proposer une forme de marketing interactive, sociale, ludique et accessible à tous! Qu’attendez-vous pour vous y mettre?</strong></p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2010/07/02/foursquare-un-reseau-social-au-service-de-votre-business/feed/</wfw:commentRss>
		<slash:comments>1</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>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>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>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>WWDC09 Keynote – yes we are attending it!</title>
		<link>http://blog.netinfluence.com/2009/06/08/wwdc-09-keynote-yes-we-are-attending-it/</link>
		<comments>http://blog.netinfluence.com/2009/06/08/wwdc-09-keynote-yes-we-are-attending-it/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 16:10:00 +0000</pubDate>
		<dc:creator>netinfluence</dc:creator>
				<category><![CDATA[create]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[silicon valley]]></category>
		<category><![CDATA[wwdc]]></category>

		<guid isPermaLink="false">http://blog.netinfluence.ch/?p=73</guid>
		<description><![CDATA[This article was originally created by Marie Girardet (Left our team) Just a short post to tell you that Emilien is now waiting for the WWDC09 Keynote to start! He got up this morning at about 4am to be sure to be among the first in the line. He put his WWDC09 T-shirt on, took his WWDC09 bag, his mac, his badge and left to Moscone West! He was meeting there 3 other folks with whom he will wait, so that they can have a break or a coffee without loosing their position in the line. They are now in the first of hundreds of people. I talked to him at 8:15am and he was on the first floor, waiting [...]]]></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>Just a short post to tell you that Emilien is now waiting for the WWDC09 Keynote to start!</p>
<p>He got up this morning at about 4am to be sure to be among the first in the line. He put his WWDC09 T-shirt on, took his WWDC09 bag, his mac, his badge and left to Moscone West!</p>
<p>He was meeting there 3 other folks with whom he will wait, so that they can have a break or a coffee without loosing their position in the line. They are now in the first of hundreds of people. I talked to him at 8:15am and he was on the first floor, waiting to go to the second floor where the keynote will be held.</p>
<p>Emilien will be tweeting about the WWDC keynote event, so if you want to see what will happen during the keynote, follow the twitter of <a hreflang="fr" href="http://twitter.com/netinfluence">netinfluence</a> and <a hreflang="fr" href="http://twitter.com/evuillaume">Emilien</a>.</p>
<p>Here are some pics of the waiting line:</p>
<p><img title="wwdc_line.jpg, juin 2009" src="/public/marie/wwdc_line.jpg" alt="" /><img title="emilien, juin 2009" src="/public/marie/emilien.jpg" alt="" /><img title="firstfloor.jpg, juin 2009" src="/public/marie/firstfloor.jpg" alt="" /></p>
<p>I will wait join them at 6pm, when they are finished with this first WWDC day, to interview them and ask them about their first impressions. Did they like the keynote? What was the global atmosphere?</p>
<p>Until then, I&#8217;am going to Berkeley this afternoon to interview Francis Pisani, an experienced journalist who is passionated by ICT evolution, in particular social media.</p>
<p>Sun did not wake up on San Francisco today, it&#8217;s rather foggy.  Anyway, I&#8217;m sure this day will be full of surprise.</p>
<p>See you then <img src='http://blog.netinfluence.com/wp-content/plugins/smilies-themer/Silk/emoticon_wink.png' alt=';-)' class='wp-smiley' /> </p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://blog.netinfluence.com/2009/06/08/wwdc-09-keynote-yes-we-are-attending-it/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

