<?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>Programar para iPhone y iPad: iOS SDK</title>
	<atom:link href="http://appsindex.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://appsindex.com</link>
	<description>Programación para iOS en español</description>
	<lastBuildDate>Fri, 28 Jan 2011 03:51:01 +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>Como hacer debug a errores EXC_BAD_ACCESS en X-Code</title>
		<link>http://appsindex.com/2011/01/como-hacer-debug-a-errores-exc_bad_access-en-x-code/</link>
		<comments>http://appsindex.com/2011/01/como-hacer-debug-a-errores-exc_bad_access-en-x-code/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 02:27:15 +0000</pubDate>
		<dc:creator>leg10n</dc:creator>
				<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[EXC_BAD_ACCESS]]></category>
		<category><![CDATA[NSZombie]]></category>
		<category><![CDATA[NSZombieEnabled]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://appsindex.com/?p=43</guid>
		<description><![CDATA[Te recomiendo que si eres nuevo en objective-c o no tienes claro el manejo de memoria, leas el Capítulo I: Objective-C. Lección 5: Manejo de Memoria. A los que habíamos programado en otros lenguajes como c o c++, java, etc., al llegar a Objective-C es traumante encontrarse con este error y no saber por qué carajos]]></description>
			<content:encoded><![CDATA[<p>Te recomiendo que si eres nuevo en objective-c o no tienes claro el manejo de memoria, leas el <a title="Enlace permanente: Capítulo I: Objective-C. Lección 5: Manejo de Memoria." rel="bookmark" href="http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-5-manejo-de-memoria/">Capítulo I: Objective-C. Lección 5: Manejo de Memoria.</a></p>
<p>A los que habíamos programado en otros lenguajes como c o c++, java, etc., al llegar a Objective-C es traumante encontrarse con este error y no saber por qué carajos sucede, bueno, sucede generalmente porque liberaste (<span style="color: #339966;"><em>release</em></span>) algo que no deberías o antes de que deberías, o no lo liberaste, o sea algún retain de más o de menos.</p>
<p>Cuando tienes algún error de este tipo el programa terminará y el xcode te mandará un mensaje que dice algo como:</p>
<pre>Program received signal:  “EXC_BAD_ACCESS”.</pre>
<p>Pero para saber dónde está el error, es dificil si tienes códigos muy grandes, para eso existe una cosa llamada <span style="color: #339966;"><em>NSZombie</em></span>, no, no se trata de Residen Evil, ni tu programa te comerá los sesos, significa que los objetos que han sido liberados (su retain count ha llegado a 0) se conserva una copia vacía, que se le llama zombie, cuando el código llama al zombie, este te advertirá que estas llamando a una instancia que ya ha sido liberada.</p>
<h2>¿Cómo habilito los objetos <em>NSZombie</em>?</h2>
<p>Abre el proyecto en el que quieres habilitar los zombies, y ubicate sobre el ejecutable del proyecto, abre el menú contextual y selecciona <strong>Get Info</strong>, luego Ve a la pestaña de <strong>Arguments</strong>, agrega en el fondo la variable <span style="color: #339966;"><em>NSZombieEnabled</em></span> y pon el valor en <span style="color: #339966;"><em>YES</em></span></p>
<div id="attachment_44" class="wp-caption alignleft" style="width: 368px"><a href="http://appsindex.com/wp-content/uploads/2011/01/getInfo.png"><img class="size-full wp-image-44" title="getInfo" src="http://appsindex.com/wp-content/uploads/2011/01/getInfo.png" alt="Get info" width="358" height="235" /></a><p class="wp-caption-text">1. Abre get Info</p></div>
<div id="attachment_45" class="wp-caption alignleft" style="width: 357px"><a href="http://appsindex.com/wp-content/uploads/2011/01/arguments.png"><img class="size-full wp-image-45" title="arguments" src="http://appsindex.com/wp-content/uploads/2011/01/arguments.png" alt="" width="347" height="131" /></a><p class="wp-caption-text">2. Argumentos</p></div>
<div id="attachment_46" class="wp-caption alignleft" style="width: 253px"><a href="http://appsindex.com/wp-content/uploads/2011/01/NSZombieEnabled.png"><img class="size-full wp-image-46" title="NSZombieEnabled" src="http://appsindex.com/wp-content/uploads/2011/01/NSZombieEnabled.png" alt="" width="243" height="92" /></a><p class="wp-caption-text">3. Agrega NSZombieEnabled</p></div>
<p>Ahora corremos de nuevo el programa, solo que ahora, cuando el programa se interrumpa, no terminará, sino que se pausa, y podemos ver que manda un mensaje como el siguiente:</p>
<pre><strong>2011-01-27 20:11:40.434 backer[20102:810b] *** -[UISearchBar respondsToSelector:]: message sent to deallocated instance 0x661e850</strong></pre>
<p>Ahora lanzamos el debugger ve al Menú <strong>Run -] Debugger</strong>:</p>
<div id="attachment_47" class="wp-caption alignleft" style="width: 564px"><a href="http://appsindex.com/wp-content/uploads/2011/01/stack.png"><img class="size-full wp-image-47" title="stack" src="http://appsindex.com/wp-content/uploads/2011/01/stack.png" alt="" width="554" height="449" /></a><p class="wp-caption-text">Pila de llamadas</p></div>
<p>En negro se muestran los métodos que están en tu código, en gris se encuentran las llamadas a métodos que se encuentran en alguna libería, entonces examinando los metodos en negro, puedes rastrear en donde estubo el objeto que liberaste más veces de las que deberías.</p>
<p><strong>No olvides desactivar el zombie una vez que hayas terminado tu debug!</strong></p>
<p><strong>Saludos!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://appsindex.com/2011/01/como-hacer-debug-a-errores-exc_bad_access-en-x-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capítulo I: Objective-C. Lección 5: Manejo de Memoria.</title>
		<link>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-5-manejo-de-memoria/</link>
		<comments>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-5-manejo-de-memoria/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 01:34:46 +0000</pubDate>
		<dc:creator>leg10n</dc:creator>
				<category><![CDATA[Aprender iOS]]></category>
		<category><![CDATA[Capítulo I]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://appsindex.com/?p=39</guid>
		<description><![CDATA[El manejo de memoria es muy importante, sobre todo en dispositivos portátiles como el iPhone y el iPod, que no cuentan con los recursos tan grandes que tienen las computadoras de escritorio de ahora. Este tema es por mucho uno de los más importantes, entre otras razones, si haces un buen manejo de memoria, evitarás]]></description>
			<content:encoded><![CDATA[<p>El manejo de memoria es muy importante, sobre todo en dispositivos portátiles como el iPhone y el iPod, que no cuentan con los recursos tan grandes que tienen las computadoras de escritorio de ahora. Este tema es por mucho uno de los más importantes, entre otras razones, si haces un buen manejo de memoria, evitarás bugs, leaks, y crashes, que son una verdadera molestia y algunos son difíciles de debuggear.</p>
<p>En las lecciones anteriores ya he realizado algunas actividades del manejo de memoria, pero es un tema tan importante que merece su propia lección.</p>
<h2>Retain y Release.</h2>
<p>El contador de retain (retain count) se utiliza para llevar un registro de las referencias activas hacia un mismo objeto. Todos los objetos tienen internamete este contador, de tal manera que si el contador de retain es mayor a cero, significa que aún esta siendo utilizado en alguna parte del código, pero una vez que llega a cero, se debe liberar la memoria que estaba usando.</p>
<p>Cuando se quiere agregar una referencia al objeto se llama al método retain: <em><span style="color: #339966;">[objeto retain];</span></em> esto aumenta el contador de retain  en 1 y cuando deseamos remover una referencia llamaremos al método release: <em><span style="color: #339966;">[objeto release];</span></em> esto disminuye el contador de retain en 1. Una vez que el contador llega a 0 (cero), se libera la memoria <strong>automáticamente </strong>con una llamada a <em><span style="color: #339966;">[self dealloc]</span></em>. Los métodos <em><span style="color: #339966;">retain </span></em>y <em><span style="color: #339966;">release </span></em>estan definidos en <em><span style="color: #339966;">NSObject</span></em>.</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;">...
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> dealloc <span class="br0">&#123;</span>
&nbsp; &nbsp;<span class="co2">//este método es llamado automáticamente cuando retain=0</span>
&nbsp; &nbsp;<span class="co2">//no debe ser llamado manualmente</span>
&nbsp; &nbsp;<span class="br0">&#91;</span>super dealloc<span class="br0">&#93;</span>;
<span class="br0">&#125;</span>
...</div>
</div>
</pre>
<p>Algunas reglas generales son:</p>
<ul>
<li>Debes liberar con <em><span style="color: #339966;">release </span></em>todo lo que tu creaste, todo lo que es creado con <em><span style="color: #339966;">alloc</span></em>, o <em><span style="color: #339966;">new</span></em>, o los métodos que contienen la palabra <em><span style="color: #339966;">copy </span></em>(<em><span style="color: #339966;">newObject</span></em>, <em><span style="color: #339966;">copyWithZone</span></em>, <em><span style="color: #339966;">mutableCopy</span></em>,&#8230;), también debes darle <em><span style="color: #339966;">release</span></em>, si manualmente diste un <em><span style="color: #339966;">retain</span></em>.</li>
<li>En otras palabras debe haber un (<strong>ni mas ni menos</strong>) <em><span style="color: #339966;">release </span></em>por cada <em><span style="color: #339966;">retain</span></em>, <em><span style="color: #339966;">alloc</span></em>, <em><span style="color: #339966;">new </span></em>o <em><span style="color: #339966;">copy</span></em>.</li>
<li>Para liberar la memoria puedes usar tanto <em><span style="color: #339966;">release</span></em>, como <em><span style="color: #339966;">autorelease</span></em>, la diferencia es que <em><span style="color: #339966;">release</span></em>, disminuye el contador de retain inmediatamente, mientras que <em><span style="color: #339966;">autorelease </span></em>lo hará en un momento en el futuro.</li>
<li>Un objeto que es recibido como retorno de algún método no debe ser liberado en el método receptor, por lo general esta garantizado que sea válido mientras dure el método que lo recibe e incluso puede ser devuelto al método que lo llamó. Aunque existen algunas excepciones como algunas aplicaciones multihilo, donde una combinación de <em><span style="color: #339966;">retain </span></em>y <em><span style="color: #339966;">release </span></em>o <em><span style="color: #339966;">autorelease </span></em>asegurarán que el objeto se mantenga válido mientras sea necesario.</li>
<li>Si deseas conservar un objeto en una variable de instancia debes darle <em>retain </em>o <em><span style="color: #339966;">copy</span></em>, generalmente se hace a través de accesadores. (ver más abajo).</li>
</ul>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co1">#import</span>
<span class="co1">#import </span>

<span class="kw4">int</span> main<span class="br0">&#40;</span> <span class="kw4">int</span> argc, <span class="kw4">const</span> <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a> <span class="sy0">*</span>uno <span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a> alloc<span class="br0">&#93;</span> initWithCString<span class="sy0">:</span> <span class="st0">&quot;Uno&quot;</span><span class="br0">&#93;</span>; <span class="co2">//al momento de crearlos tienen retain count=1</span>
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a> <span class="sy0">*</span>dos <span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a> alloc<span class="br0">&#93;</span> initWithCString<span class="sy0">:</span> <span class="st0">&quot;Dos&quot;</span><span class="br0">&#93;</span>; <span class="co2">//retain=1</span>
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a> <span class="sy0">*</span>tres <span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a> alloc<span class="br0">&#93;</span> initWithCString<span class="sy0">:</span> <span class="st0">&quot;Tres&quot;</span><span class="br0">&#93;</span>; <span class="co2">//retain=1</span>

&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span> <span class="st0">&quot;Retain count uno: %d<span class="es0">\n</span>&quot;</span>, <span class="br0">&#91;</span>uno retainCount<span class="br0">&#93;</span> <span class="br0">&#41;</span>; <span class="co2">//1</span>
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span> <span class="st0">&quot;Retain count dos: %d<span class="es0">\n</span>&quot;</span>, <span class="br0">&#91;</span>uno retainCount<span class="br0">&#93;</span> <span class="br0">&#41;</span>; <span class="co2">//1</span>
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span> <span class="st0">&quot;Retain count tres: %d<span class="es0">\n</span>&quot;</span>, <span class="br0">&#91;</span>tres retainCount<span class="br0">&#93;</span> <span class="br0">&#41;</span>; <span class="co2">//1</span>

&nbsp; &nbsp; <span class="co2">//Si agregamos las cadenas a un array, el array agregara 1 al retain count para asegurarse</span>
&nbsp; &nbsp; <span class="co2">//que los objetos sigan siendo válidos, serán liberados automáticamente cuando array sea liberado</span>
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> <span class="sy0">*</span>array<span class="sy0">=</span><span class="br0">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> arrayWithObjects<span class="sy0">:</span> uno, dos, <span class="kw2">nil</span><span class="br0">&#93;</span>; <span class="co2">//uno++;dos++;</span>

&nbsp; &nbsp; <span class="br0">&#91;</span>dos release<span class="br0">&#93;</span>;<span class="co2">//dos-- si libero la memoria de dos, el objeto sigue siendo válido ya que fué asegurado por array</span>

&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span> <span class="st0">&quot;Retain count uno: %d<span class="es0">\n</span>&quot;</span>, <span class="br0">&#91;</span>uno retainCount<span class="br0">&#93;</span> <span class="br0">&#41;</span>; <span class="co2">//2</span>
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span> <span class="st0">&quot;Retain count dos: %d<span class="es0">\n</span>&quot;</span>, <span class="br0">&#91;</span>uno retainCount<span class="br0">&#93;</span> <span class="br0">&#41;</span>; <span class="co2">//1</span>
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span> <span class="st0">&quot;Retain count tres: %d<span class="es0">\n</span>&quot;</span>, <span class="br0">&#91;</span>tres retainCount<span class="br0">&#93;</span> <span class="br0">&#41;</span>; <span class="co2">//sigue siendo 1 ya que no fue agregado al array</span>

&nbsp; &nbsp; <span class="br0">&#91;</span>uno release<span class="br0">&#93;</span>; <span class="co2">//uno--</span>
&nbsp; &nbsp; <span class="br0">&#91;</span>tres release<span class="br0">&#93;</span>; <span class="co2">//tres--</span>
&nbsp; &nbsp; <span class="co2">//dos no debe ser liberado otra vez, ya fue liberado una vez.</span>

&nbsp; &nbsp; <span class="co2">//en este punto uno y dos siguen siendo válidos, ya que array sigue siendo válido</span>
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span> <span class="st0">&quot;Retain count uno: %d<span class="es0">\n</span>&quot;</span>, <span class="br0">&#91;</span>uno retainCount<span class="br0">&#93;</span> <span class="br0">&#41;</span>; <span class="co2">//1</span>
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span> <span class="st0">&quot;Retain count dos: %d<span class="es0">\n</span>&quot;</span>, <span class="br0">&#91;</span>uno retainCount<span class="br0">&#93;</span> <span class="br0">&#41;</span>; <span class="co2">//1</span>
&nbsp; &nbsp; <span class="co2">//printf( &quot;Retain count tres: %d\n&quot;, [tres retainCount] ); //esta instancia ya no es válida</span>

&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;
<span class="br0">&#125;</span></div>
</div>
</pre>
<h2>¿Cuándo hacer y cuando no hacer release?</h2>
<p>Se debe llamar a <span style="color: #339966;"><em>release</em></span> siempre cuando se tenga responsabilidad del objeto y ya no se necesite la referencia: Ej:<br />
Correcto:</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> llamadoCorrectoDeRelease <span class="br0">&#123;</span>
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> <span class="sy0">*</span>arregloUno<span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> alloc<span class="br0">&#93;</span> init<span class="br0">&#93;</span>; <span class="co2">//como se llamó a alloc, es reponsabilidad de este método liberarlo en su momento</span>
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> <span class="sy0">*</span>arregloDos<span class="sy0">=</span><span class="br0">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> array<span class="br0">&#93;</span>; <span class="co2">//devuelve un arreglo que NO es responsabilidad de este método</span>
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> <span class="sy0">*</span>arregloTres<span class="sy0">=</span><span class="br0">&#91;</span>arregloDos copy<span class="br0">&#93;</span>; <span class="co2">//devuelve una copia (no profunda) del objeto en arregloDos, responsabilidad del método</span>

&nbsp; &nbsp; <span class="co2">//Uso de los objetos....</span>

&nbsp; &nbsp; <span class="co2">//Liberacion</span>
&nbsp; &nbsp; <span class="br0">&#91;</span>arregloUno release<span class="br0">&#93;</span>; <span class="co2">//responsable por alloc</span>
&nbsp; &nbsp; <span class="co2">//[arregloDos release] // NO se debe llamar a release, no es responsabilidad del método, y si se libera causará una excepción</span>
&nbsp; &nbsp; <span class="br0">&#91;</span>arregloTres release<span class="br0">&#93;</span>; <span class="co2">//responsable por copy</span>
<span class="br0">&#125;</span></div>
</div>
</pre>
<h2>¿Cuándo hacer y cuando no hacer autorelease?</h2>
<p>Se debe llamar a <span style="color: #339966;"><em>autorelease</em></span> cuando se tenga responsabilidad del objeto y pero se necesite la referencia en un nivel superior de la pila de llamadas: Ej:<br />
Correcto:</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="sy0">-</span><span class="br0">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a><span class="br0">&#41;</span> llamadoCorrectoDeAutoRelease <span class="br0">&#123;</span>
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> <span class="sy0">*</span>arregloUno<span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> alloc<span class="br0">&#93;</span> init<span class="br0">&#93;</span>; <span class="co2">//como se llamó a alloc, es reponsabilidad de este método liberarlo en su momento</span>
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> <span class="sy0">*</span>arregloDos<span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> alloc<span class="br0">&#93;</span> init<span class="br0">&#93;</span>; <span class="co2">//como se llamó a alloc, es reponsabilidad de este método liberarlo en su momento</span>

&nbsp; &nbsp; <span class="co2">//Uso del array....</span>

&nbsp; &nbsp; <span class="co2">//liberación</span>
&nbsp; &nbsp; <span class="br0">&#91;</span>arregloDos release<span class="br0">&#93;</span>; <span class="co2">//después de este punto arregloDos ya no es referencia válida</span>

&nbsp; &nbsp; <span class="co2">//Se debe liberar ya que fué creado con alloc, pero aún se quiere usar en metodoInvocador, se usa autorelease y se devuelve al invocador</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#91;</span>arregloUno autorelease<span class="br0">&#93;</span>; <span class="co2">//responsable por alloc</span>
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> metodoInvocador <span class="br0">&#123;</span>
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/"><span class="kw5">NSArray</span></a> <span class="sy0">*</span>objetoAutoLiberado<span class="sy0">=</span><span class="br0">&#91;</span>self llamadoCorrectoDeAutoRelease<span class="br0">&#93;</span>;

&nbsp; &nbsp; <span class="co2">//se puede usar objetoAutoLiberado con seguridad y no debe ser liberado aquí, ya que es responsabilidad de llamadoCorrectoDeAutoRelease</span>
&nbsp; &nbsp; <span class="co2">//[objetoAutoLiberado release]; //llamar a release aquí es INCORRECTO!, ya se ha llamado a autorelease, no es necesiario hacer más</span>
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>Al llamar a <span style="color: #339966;"><em>autorelease</em></span>, se te garantiza que la referencia será válida incluso si la devuelves al método invocador,</p>
<h2>Propiedades, accesadores (o accesores?) y notación de punto.</h2>
<p>Las propiedades y accesores (o accesadores, como sea, jeje), tienen algunas particularidades en objective-c y son de mis características favoritas, ya que ayudan al encapsulamiento y le dan un estilo bastante elegante.</p>
<p>¿Que son accesadores (accessors)? Son métodos para leer y escribir propiedades (variables de instancia) de un objeto. El método para escribir, se le llama Setter, y al método para leer se llama Getter, y son definidos automáticamente por objective-c:</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">//Persona.h</span>
<span class="kw1">@interface</span> Persona <span class="sy0">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span class="kw5">NSObject</span></a> <span class="br0">&#123;</span>
&nbsp; &nbsp; <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a> <span class="sy0">*</span>nombre;
<span class="br0">&#125;</span>
<span class="kw1">@property</span> <span class="br0">&#40;</span>nonatomic, retain<span class="br0">&#41;</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/"><span class="kw5">NSString</span></a> <span class="sy0">*</span>nombre;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> usoDeAccesador;
<span class="kw1">@end</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">//Persona.m</span>
<span class="co1">#import &quot;Persona.h&quot;</span>
<span class="kw1">@implementation</span> Persona
@synthetize nombre;

<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> usoDeAccesador <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="co2">//Setter</span>
&nbsp; &nbsp; <span class="br0">&#91;</span>self setNombre<span class="sy0">:</span><span class="co3">@</span><span class="st0">&quot;Pedro&quot;</span><span class="br0">&#93;</span>;
&nbsp; &nbsp; <span class="co2">//Getter</span>
&nbsp; &nbsp; NSLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;%@&quot;</span>, <span class="br0">&#91;</span>self getNombre<span class="br0">&#93;</span><span class="br0">&#41;</span>;

&nbsp; &nbsp; <span class="co2">//Método abreviado con &quot;.&quot; (punto)</span>
&nbsp; &nbsp; self.nombre<span class="sy0">=</span><span class="co3">@</span><span class="st0">&quot;Yo no me llamo Javier&quot;</span>; <span class="co2">//setter</span>
&nbsp; &nbsp; NSLog<span class="br0">&#40;</span><span class="co3">@</span><span class="st0">&quot;%@&quot;</span>, self.nombre<span class="br0">&#41;</span>; <span class="co2">//getter</span>
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> dealloc <span class="br0">&#123;</span>
&nbsp; &nbsp; self.nombre<span class="sy0">=</span><span class="kw2">nil</span>;

&nbsp; &nbsp; <span class="co2">// también es posible usar lo siguiente, pero uno solo de los dos!</span>
&nbsp; &nbsp; <span class="co2">//[self release];</span>
&nbsp; &nbsp; <span class="co2">//creo que es mejor usar la opción primera (self.nombre=nil), porque se asegura que no envíes mensajes de manera accidental a una instancia inválida</span>
<span class="br0">&#125;</span>
<span class="kw1">@end</span></div>
</div>
</pre>
<ul>
<li>A través del accesador podemos obtener acceso a las variables de instancia, tanto para escribir como para leer.</li>
<li>Para definir los accesadores debemos declararlo primero con: <span style="color: #339966;"><em>@property (modificadores) TipoDeLaVariable *nombreDeVariable;</em></span></li>
<li>@<em><span style="color: #339966;">synthetize</span></em> se usa para que objective-c implemente automáticamente los métodos.</li>
</ul>
<p>Existen diferentes modificadores para las propiedades:</p>
<ol>
<li><span style="color: #339966;"><em>readonly</em></span>: muy claro, indica que solo se creará el método para leer, y no para escribir.</li>
<li><span style="color: #339966;"><em>atomic</em></span> / <span style="color: #339966;"><em>nonatomic</em></span>: <span style="color: #339966;"><em>atomic</em></span> indica que se implementará una cerradura para impedir que múltiples métodos (en programas multihilo) accedan a la propiedad, <span style="color: #339966;"><em>nonatomic</em></span> no implementa la cerradura.</li>
<li><span style="color: #339966;"><em>assign</em></span>: Se implementa el método de setter de tal manera que solo se asigna: seria equivalente a algo como: <span style="color: #339966;"><em>-(void) setPropiedad: (id)valor { propiedad=valor; }</em></span> es decir una asignación simple.</li>
<li><span style="color: #339966;"><em>copy</em></span>: Si se especifica <span style="color: #339966;"><em>copy</em></span>, el método setter, se implementará haciendo una copia del objeto asignado, al hacer esto se debe liberar con release ya que fué copiado (<span style="color: #339966;"><em>copy</em></span>)</li>
<li><span style="color: #339966;"><em>retain</em></span>: Al igual que con copy, retain aumenta el contador de retain en 1, por lo que debe ser liberado con release cuando sea adecuado. ¿Cuándo es adecuado?, sigue leyendo. La implementación que objective-c hace automáticamente, sería parecida a la siguiente:<br />
<em><span style="color: #339966;">-(void) setPropiedad: (id)valor {<br />
if (propiedad=nil) { [propiedad release]; }<br />
propiedad=[valor retain];<br />
}</span>.</em></li>
<li>Si se asigna un nuevo objeto a una propiedad marcada con <span style="color: #339966;"><em>retain</em></span>, se libera cuando se asigna el nuevo objeto, pero, debes entender que no ocurre automáticamente sino cuando le asignas un nuevo objeto, por lo que el viejo es liberado, pero el nuevo no será liberado hasta que tu lo indiques. Lee a continuación:</li>
</ol>
<h3>Si utilizo copy o retain en la propiedad, ¿cuándo debo llamar a release? Dealloc!!</h3>
<p>Depende de cada programa, pero sigue las mismas reglas, se libera cuando ya no se necesite, generalmente se libera cuando el objeto contenedor no es necesario, para esto utilizaremos el método especial <span style="color: #339966;"><em>dealloc</em></span>.</p>
<p>El método dealloc es invocado automáticamente cuando el objeto va a morir, entonces ahí podemos liberar las propiedades que fueron marcadas con retain y copy.</p>
]]></content:encoded>
			<wfw:commentRss>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-5-manejo-de-memoria/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Capítulo I: Objective-C. Lección 4: Categorías.</title>
		<link>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-4-categorias/</link>
		<comments>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-4-categorias/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 06:37:30 +0000</pubDate>
		<dc:creator>leg10n</dc:creator>
				<category><![CDATA[Aprender iOS]]></category>
		<category><![CDATA[Capítulo I]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://appsindex.com/?p=34</guid>
		<description><![CDATA[Ir a Lección 3: Herencia. Las categorías son una característica muy util de Objective-C, muy útiles cuando quieres agregar funcionalidad a una clase, pero no quieres reescribirla o no tienes el código fuente como cuando se encuentra en una biblioteca. Supongamos que tenemos una clase Perro con la siguiente declaración y definición: // &#160;Perro.h @interface]]></description>
			<content:encoded><![CDATA[<p>Ir a <a href="http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-3-herencia/">Lección 3: Herencia</a>.</p>
<p>Las categorías son una característica muy util de Objective-C, muy útiles cuando quieres agregar funcionalidad a una clase, pero no quieres reescribirla o no tienes el código fuente como cuando se encuentra en una biblioteca.<br />
Supongamos que tenemos una clase Perro con la siguiente declaración y definición:</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;Perro.h</span>
<span class="kw1">@interface</span> Perro <span class="sy0">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span class="kw5">NSObject</span></a> <span class="br0">&#123;</span>
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> ladra;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> corre;
<span class="kw1">@end</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;Perro.m</span>
<span class="co1">#import &quot;Perro.h&quot;</span>
<span class="kw1">@implementation</span> Perro
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> ladra <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//Guau guau</span>
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> corre <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//trut trut turut</span>
<span class="br0">&#125;</span>
<span class="kw1">@end</span></div>
</div>
</pre>
<p>Se puede agregar métodos a una clase existente, aún si no tuvieramos su código fuente con una categoría:</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;PerroTrucos.h</span>
<span class="kw1">@interface</span> Perro <span class="br0">&#40;</span>Trucos<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> traeLaVarita;
<span class="kw1">@end</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;Perro.m</span>
<span class="co1">#import &quot;PerroTrucos.h&quot;</span>
<span class="kw1">@implementation</span> Perro <span class="br0">&#40;</span>Trucos<span class="br0">&#41;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> traeLaVarita <span class="br0">&#123;</span>
&nbsp;<span class="co2">//va por la varita</span>
<span class="br0">&#125;</span>
<span class="kw1">@end</span></div>
</div>
</pre>
<ul>
<li>Para crear una categoría, se debe declarar con <span style="color: #339966;">@interface NombreDeClaseExistente (NombreDeCategoriaNueva)</span></li>
<li>Una vez declarada la categoría se define con <span style="color: #339966;">@implementation NombreDeClaseExistente (NombreDeCategoriaNueva)</span></li>
<li>Solo se pueden agregar Métodos, no se aceptan variables de instancia.</li>
<li>Solo puede haber una categoría con el mismo nombre, pero se pueden agregar muchas categorías a una misma clase.</li>
<li></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-4-categorias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capítulo I: Objective-c. Lección 3: Herencia</title>
		<link>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-3-herencia/</link>
		<comments>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-3-herencia/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 06:15:57 +0000</pubDate>
		<dc:creator>leg10n</dc:creator>
				<category><![CDATA[Aprender iOS]]></category>
		<category><![CDATA[Capítulo I]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://appsindex.com/?p=30</guid>
		<description><![CDATA[Ver lección 2: Métodos y miembros. El tipo de datos id. En objective-c existe un tipo de datos llamado id. que actúa de manera similar a void*, es decir, puede apuntar a cualquier tipo de objeto, por lo anterior, en objective-c cuando invocamos métodos no se requiere (no obligatoriamente) saber los tipos de los objetos,]]></description>
			<content:encoded><![CDATA[<p><a href="http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-2-metodos-y-miembros/">Ver lección 2: Métodos y miembros.</a></p>
<h2><a href="http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-2-metodos-y-miembros/"></a>El tipo de datos id.</h2>
<p>En objective-c existe un tipo de datos llamado <span style="color: #339966;"><em>id</em></span>. que actúa de manera similar a <span style="color: #339966;"><em>void*</em></span>, es decir, puede apuntar a cualquier tipo de objeto, por lo anterior, en objective-c cuando invocamos métodos no se requiere (no obligatoriamente) saber los tipos de los objetos, es suficiente con que el método exista, a esto se le llama pasar un mensaje.</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;Perro.h</span>
<span class="kw1">@interface</span> Perro <span class="sy0">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span class="kw5">NSObject</span></a> <span class="br0">&#123;</span>
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> ladra;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> corre;
<span class="kw1">@end</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;Perro.m</span>
<span class="co1">#import &quot;Perro.h&quot;</span>
<span class="kw1">@implementation</span> Perro
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> ladra <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//Guau guau</span>
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> corre <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//trut trut turut</span>
<span class="br0">&#125;</span>
<span class="kw1">@end</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;Gato.h</span>
<span class="kw1">@interface</span> Gato <span class="sy0">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span class="kw5">NSObject</span></a> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> maulla;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> corre;
<span class="br0">&#125;</span>
<span class="kw1">@end</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;Gato.m</span>
<span class="co1">#import &quot;Gato.h&quot;</span>
<span class="kw1">@implementation</span> Gato
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> maulla<span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//miauuu miauu</span>
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> corre <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//silencio</span>
<span class="br0">&#125;</span>
<span class="kw1">@end</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co1">#include &lt;stdio.h&gt;</span>
<span class="co1">#import &quot;Perro.h&quot;</span>
<span class="co1">#import &quot;Gato.h&quot;</span>
<span class="kw4">int</span> main <span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">const</span> <span class="kw4">char</span> <span class="sy0">*</span> argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; Perro <span class="sy0">*</span>rintintin<span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span>Perro alloc<span class="br0">&#93;</span> init<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; Gato <span class="sy0">*</span>misifus<span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span>Gato alloc<span class="br0">&#93;</span> init<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">id</span> cuadrupedo<span class="sy0">:</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//métodos de cada clase</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>rintintin ladra<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>misifus maulla<span class="br0">&#93;</span>;

&nbsp; &nbsp; &nbsp; &nbsp; cuadrupedo<span class="sy0">=</span>rintintin; <span class="co2">//rintintin es instancia de Perro</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>cuadrupedo corre<span class="br0">&#93;</span>; <span class="co2">//trut trut</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//[cuadrupedo maulla]; //Genera excepción ya que Perro no implementa el método maulla</span>

&nbsp; &nbsp; &nbsp; &nbsp; cuadrupedo<span class="sy0">=</span>misifus; <span class="co2">//misifus es una instancia de Gato</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>cuadrupedo corre<span class="br0">&#93;</span><span class="sy0">:</span> <span class="co2">//silencio</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//[cuadrupedo ladra]; //Genera excepción ya que Gato no implementa el método ladra</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//liberar memoria</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>rintintin release<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>misifus release<span class="br0">&#93;</span>;
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>Podemos invocar los métodos desde ambas clases cuando las asignamos a la variable <em><span style="color: #339966;">cuadrupedo</span></em>, que es tipo <span style="color: #339966;"><em>id</em></span>, y por lo tanto no le importa si la instancia a la que apunta tiene implementado el método que se le pasa, ni hay que hacer castings, simplemente intentará enviar el mensaje a la instancia, y si el método no existiera, generaría una excepción.</p>
<h2>Herencia.</h2>
<p>La herencia en Objective-C es similar a java, se pueden sobreescribir los métodos simplemente escribiendo en la clase hija la nueva definición del método.</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;Mamifero.h</span>
<span class="co1">#import </span>
<span class="kw1">@interface</span> Mamifero <span class="sy0">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span class="kw5">NSObject</span></a> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> patas;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">char</span> <span class="sy0">*</span>nombre;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> getPatas;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">char</span><span class="sy0">*</span><span class="br0">&#41;</span> getNombre;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span> initWithNombre<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">char</span><span class="sy0">*</span><span class="br0">&#41;</span>_nombre Patas<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>_patas;
<span class="kw1">@end</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;Mamifero.c</span>
<span class="co1">#import &quot;Mamifero.h&quot;</span>
<span class="kw1">@implementation</span> Mamifero
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> getPatas <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> patas;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">char</span><span class="sy0">*</span><span class="br0">&#41;</span> getNombre <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> nombre;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span> initWithNombre<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">char</span><span class="sy0">*</span><span class="br0">&#41;</span>_nombre Patas<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>_patas <span class="br0">&#123;</span>
&nbsp; &nbsp; self <span class="sy0">=</span> <span class="br0">&#91;</span>super init<span class="br0">&#93;</span>;
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> self <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; nombre<span class="sy0">=</span>_parteReal;
&nbsp; &nbsp; &nbsp; &nbsp; patas<span class="sy0">=</span>_patas;
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">return</span> self;

<span class="br0">&#125;</span>
<span class="kw1">@end</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;Perro.h</span>
<span class="co1">#import </span>
<span class="co1">#import &quot;Mamifero.h&quot;</span>
<span class="kw1">@interface</span> Perro <span class="sy0">:</span> Mamifero <span class="br0">&#123;</span>
&nbsp; &nbsp; <span class="kw4">char</span> raza;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> getRaza;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span> initWithNombre<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">char</span><span class="sy0">*</span><span class="br0">&#41;</span>_nombre Raza<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">char</span><span class="sy0">*</span><span class="br0">&#41;</span>_raza;
<span class="kw1">@end</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;Perro.c</span>
<span class="co1">#import &quot;Perro.h&quot;</span>
<span class="kw1">@implementation</span> Perro
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> getRaza <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> raza;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">id</span><span class="br0">&#41;</span> initWithNombre<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">char</span><span class="sy0">*</span><span class="br0">&#41;</span>_nombre Raza<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">char</span><span class="sy0">*</span><span class="br0">&#41;</span>_raza <span class="br0">&#123;</span>
&nbsp; &nbsp; self <span class="sy0">=</span> <span class="br0">&#91;</span>super initWithNombre<span class="sy0">:</span>_nombre Patas<span class="sy0">:</span>4<span class="br0">&#93;</span>;
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> self <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; raza<span class="sy0">=</span>_raza;
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">return</span> self;
<span class="br0">&#125;</span>
<span class="kw1">@end</span></div>
</div>
</pre>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co1">#import &quot;Mamifero.h&quot;</span>
<span class="co1">#import &quot;Perro.h&quot;</span>
<span class="co1">#import </span>
<span class="kw4">int</span> main<span class="br0">&#40;</span> <span class="kw4">int</span> argc, <span class="kw4">const</span> <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; Mamifero <span class="sy0">*</span>mamifero <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>Mamiferoalloc<span class="br0">&#93;</span> initWithNombre<span class="sy0">:</span><span class="st0">&quot;Juan Perez&quot;</span> Patas<span class="sy0">:</span>2<span class="br0">&#93;</span>;
&nbsp; &nbsp; Perro <span class="sy0">*</span>perro <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>Perro alloc<span class="br0">&#93;</span> initWithNombre<span class="sy0">:</span><span class="st0">&quot;firulais&quot;</span> Raza<span class="sy0">:</span><span class="st0">&quot;Rottweiler&quot;</span><span class="br0">&#93;</span>;

&nbsp; &nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span>Numero de Patas Mamifero %d&quot;</span>,<span class="br0">&#91;</span>mamifero getPatas<span class="br0">&#93;</span><span class="br0">&#41;</span>; <span class="co2">//2</span>
&nbsp; &nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span>Numero de Patas Perro %d&quot;</span>,<span class="br0">&#91;</span>mamifero getPatas<span class="br0">&#93;</span><span class="br0">&#41;</span>; <span class="co2">//4 asignado automaticamente</span>

&nbsp; &nbsp; <span class="br0">&#91;</span>mamifero release<span class="br0">&#93;</span>;
&nbsp; &nbsp; <span class="br0">&#91;</span>perro release<span class="br0">&#93;</span>;
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>La herencia es parecida a Java, solo se puede tener una clase padre, y para sobreescribir los métodos, simplemente escribimos una nueva definición en la clase hija.</p>
<p>Saludos!</p>
]]></content:encoded>
			<wfw:commentRss>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-3-herencia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capítulo I: Objective-C. Lección 2: Métodos y miembros.</title>
		<link>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-2-metodos-y-miembros/</link>
		<comments>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-2-metodos-y-miembros/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 23:03:10 +0000</pubDate>
		<dc:creator>leg10n</dc:creator>
				<category><![CDATA[Aprender iOS]]></category>
		<category><![CDATA[Capítulo I]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://appsindex.com/?p=23</guid>
		<description><![CDATA[Ver Lección 1: Conoce la sintaxis. Niveles de acceso a miembros. El nivel de acceso a miembros de una clase se especifica de manera similar a c++: //Clase.h @interface Clase : NSObject &#123; @private &#160; &#160; &#160; &#160; int miembroPrivado1; &#160; &#160; &#160; &#160; int miembroPrivado2; @public &#160; &#160; &#160; &#160; int miembroPublico; @protected &#160;]]></description>
			<content:encoded><![CDATA[<p><a href="http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-1-conoce-la-sintaxis/">Ver Lección 1: Conoce la sintaxis.</a></p>
<h2>Niveles de acceso a miembros.</h2>
<p>El nivel de acceso a miembros de una clase se especifica de manera similar a c++:</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">//Clase.h</span>
<span class="kw1">@interface</span> Clase <span class="sy0">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span class="kw5">NSObject</span></a> <span class="br0">&#123;</span>
<span class="kw1">@private</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> miembroPrivado1;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> miembroPrivado2;
<span class="kw1">@public</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> miembroPublico;
<span class="kw1">@protected</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> miembroProtegido;
<span class="br0">&#125;</span>

<span class="co2">//</span>
<span class="co2">// &nbsp;Clase.m</span>
<span class="co1">#import &quot;Clase.h&quot;</span>
<span class="kw1">@implementation</span> Clase
<span class="kw1">@end</span></div>
</div>
</pre>
<p>Los miembros públicos son utilizados de la siguiente manera:</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co1">#include &lt;stdio.h&gt; </span>
<span class="co1">#import &quot;Clase.h&quot;</span>
<span class="kw4">int</span> main <span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">const</span> <span class="kw4">char</span> <span class="sy0">*</span> argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; Clase <span class="sy0">*</span>c <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>Clase alloc<span class="br0">&#93;</span> init<span class="br0">&#93;</span>;

&nbsp; &nbsp; <span class="co2">//Acceder a miembroPublico</span>
&nbsp; &nbsp; c<span class="sy0">-</span>&gt;miembroPublico <span class="sy0">=</span> <span class="nu0">69</span>;
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;Miembro Público: %d<span class="es0">\n</span>&quot;</span>, c<span class="sy0">-</span>&gt;miembroPublico <span class="br0">&#41;</span>;

&nbsp; &nbsp; <span class="co2">// No se puede acceder al miembroPrivado</span>
&nbsp; &nbsp; <span class="co2">//c-&gt;miembroPrivado1 = 123;</span>
&nbsp; &nbsp; <span class="co2">//printf(&quot;Miembro Privado: %d\n&quot;, c-&gt;miembroPrivado1 );</span>

&nbsp; &nbsp; <span class="br0">&#91;</span>c release<span class="br0">&#93;</span>;
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;
<span class="br0">&#125;</span></div>
</div>
</pre>
<h2>Métodos en Objective-C.</h2>
<p>Ya vimos la declaración y definición de métodos en objective-c en la lección pasada, pero aún quedan algunos detalles por ver, en primer lugar veamos los métodos de Instancia y Métodos de Clase:</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">// &nbsp;NumeroComplejo.h</span>
<span class="co1">#import &lt;Cocoa/Cocoa.h&gt;</span>
<span class="kw1">@interface</span> NumeroComplejo <span class="sy0">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span class="kw5">NSObject</span></a> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> parteReal;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> parteImaginaria;
<span class="br0">&#125;</span>
<span class="co2">//Métodos de Instancia</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> initWithParteReal<span class="sy0">:</span> <span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>_parteReal ParteImaginaria<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>_parteImaginaria;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> sumarNumeroComplejo<span class="sy0">:</span><span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span>sumando;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> restarNumeroComplejo<span class="sy0">:</span><span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span>substrayendo;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> getParteReal;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> getParteImaginaria;
<span class="co2">//Métodos de Clase</span>
<span class="sy0">+</span><span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span> sumarNumerosComplejos<span class="sy0">:</span><span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span>sumandoUno SumandoDos<span class="sy0">:</span><span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span>sumandoDos;
<span class="sy0">+</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> initialize;
<span class="kw1">@end</span></div>
</div>
</pre>
<p>Los métodos de instancia solo pueden ser utilizados si se ha creado una instancia de la clase <span style="color: #339966;"><em>[instanciaDeNumeroComplejo sumarNumeroComplejo:otraInstancia]</em></span>, los métodos de clase pueden ser usados sin crear una instancia de la clase, se utilizan a través del nombre de la clase: <span style="color: #339966;"><em>[NumeroComplejo initialize]</em></span>. <span style="color: #339966;"><em>Initialize</em></span> es un método especial de objective-c, el cual es <strong>invocado automáticamente,</strong> en el momento que se utilice la clase por primera vez, no es necesario que lo llames.</p>
<h3>Métodos con muchos parámetros:</h3>
<p>Cuando un método requiere de más de un parámetro se utiliza la siguinte forma:</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="sy0">+</span> &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span> sumarNumerosComplejos<span class="sy0">:</span><span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span>sumandoUno SumandoDos<span class="sy0">:</span> &nbsp;<span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span>sumandoDos;
<span class="co2">//acceso (tipoDeRetorno) &nbsp; nombreDeMétodo: &nbsp; &nbsp; &nbsp; (tipoParametro1) parametro1 NombreParám2:(tipoParametro2) parametro2;</span></div>
</div>
</pre>
<p>En este caso el Método llamado <span style="color: #339966;"><em>sumarNumerosComplejos</em></span> es un método de Clase, que devuelve un <span style="color: #339966;"><em>NumeroComplejo*</em></span> y toma dos parámetros <em><span style="color: #339966;">NumeroComplejo*</span></em>; algo que no existe ni en C/C++ ni java son los nombres de los parámetros, que no sirven para nada en el código, pero son muy útiles para el programador, ya que te dicen qué parámetro sigue.</p>
<p>Ahora veamos la implementación de la clase:</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">//</span>
<span class="co2">// &nbsp;NumeroComplejo.m</span>
<span class="co1">#import &quot;NumeroComplejo.h&quot;</span>
<span class="kw1">@implementation</span> NumeroComplejo
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> initWithParteReal<span class="sy0">:</span> <span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>_parteReal ParteImaginaria<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>_parteImaginaria <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; self <span class="sy0">=</span> <span class="br0">&#91;</span>super init<span class="br0">&#93;</span>;
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> self <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; parteReal<span class="sy0">=</span>_parteReal;
&nbsp; &nbsp; &nbsp; &nbsp; parteImaginaria<span class="sy0">=</span>_parteImaginaria;
&nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="kw1">return</span> self;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> sumarNumeroComplejo<span class="sy0">:</span><span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span>sumando <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; parteReal<span class="sy0">+=</span><span class="br0">&#91;</span>sumando getParteReal<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; parteImaginaria<span class="sy0">+=</span><span class="br0">&#91;</span>sumando getParteImaginaria<span class="br0">&#93;</span>;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> restarNumeroComplejo<span class="sy0">:</span><span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span>substrayendo <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; parteReal<span class="sy0">-=</span><span class="br0">&#91;</span>sumando getParteReal<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; parteImaginaria<span class="sy0">-=</span><span class="br0">&#91;</span>sumando getParteImaginaria<span class="br0">&#93;</span>;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> getParteReal <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> parteReal;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> getParteImaginaria <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> parteImaginaria;
<span class="br0">&#125;</span>
<span class="co2">//Métodos de Clase</span>
<span class="sy0">+</span><span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span> sumarNumerosComplejos<span class="sy0">:</span><span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span>sumandoUno SumandoDos<span class="sy0">:</span><span class="br0">&#40;</span>NumeroComplejo<span class="sy0">*</span><span class="br0">&#41;</span>sumandoDos <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; NumeroComplejo <span class="sy0">*</span>resultado<span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span>NumeroComplejo alloc<span class="br0">&#93;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;initWithParteReal<span class="sy0">:</span><span class="br0">&#91;</span>sumandoUno getParteReal<span class="br0">&#93;</span> ParteImaginaria<span class="sy0">:</span><span class="br0">&#91;</span>sumandoUno getParteImaginaria<span class="br0">&#93;</span><span class="br0">&#93;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>resultado sumarNumeroComplejo<span class="sy0">:</span>sumandoDos<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#91;</span>resultado autorelease<span class="br0">&#93;</span>; <span class="co2">//libera memoria cuando ya no es usada automaticamente</span>
<span class="br0">&#125;</span>
<span class="sy0">+</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> initialize <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//no necesito inicializar nada antes de usar la clase</span>
<span class="br0">&#125;</span>
<span class="kw1">@end</span></div>
</div>
</pre>
<h3>El método <span style="color: #339966;"><em>init</em></span>.</h3>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> initWithParteReal<span class="sy0">:</span> <span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>_parteReal ParteImaginaria<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>_parteImaginaria;</div>
</div>
</pre>
<ul>
<li>El método <span style="color: #339966;"><em>init</em></span> es parecido a los constructores de c++, en él, se asignan los valores iniciales de la instancia.</li>
<li>Verifica que <span style="color: #339966;"><em>alloc</em></span> haya devuelto una instancia válida al compararla con <span style="color: #339966;"><em>nil</em></span>, <span style="color: #339966;"><em>nil</em></span> es el equivalente a <span style="color: #339966;"><em>NULL,</em></span> pero <span style="color: #339966;"><em>nil</em></span> es un objeto.</li>
<li>Para acceder al método del ancestro se utiliza <span style="color: #339966;"><em>super</em></span>, como en <span style="color: #339966;"><em>[super init]</em></span>.</li>
<li>El constructor por defecto es <span style="color: #339966;"><em>-(id) init</em></span>. El cual solo verifica que se haya creado la instancia, pero no inicializa valores.</li>
<li>En general los metodos init, en objective-c solo realizan operaciones de inicialización, y no otras operaciones como en java o c++.</li>
</ul>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co1">#include &lt;stdio.h&gt;</span>
<span class="co1">#import &quot;NumeroComplejo.h&quot;</span>
<span class="kw4">int</span> main <span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">const</span> <span class="kw4">char</span> <span class="sy0">*</span> argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>

&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//2i+1</span>
&nbsp; &nbsp; NumeroComplejo <span class="sy0">*</span>complejo1<span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span>NumeroComplejo alloc<span class="br0">&#93;</span> initWithParteReal<span class="sy0">:</span>1 ParteImaginaria<span class="sy0">:</span>2<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//2i+3</span>
&nbsp; &nbsp; &nbsp; &nbsp; NumeroComplejo <span class="sy0">*</span>complejo2<span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span>NumeroComplejo alloc<span class="br0">&#93;</span> initWithParteReal<span class="sy0">:</span>3 ParteImaginaria<span class="sy0">:</span>2<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//4i+4</span>
&nbsp; &nbsp; &nbsp; &nbsp; NumeroComplejo <span class="sy0">*</span>suma<span class="sy0">=</span><span class="br0">&#91;</span>NumeroComplejo sumarNumerosComplejos<span class="sy0">:</span>complejo1 SumandoDos<span class="sy0">:</span>complejo2<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//5i+4</span>
&nbsp; &nbsp; &nbsp; &nbsp; NumeroComplejo <span class="sy0">*</span>complejo3<span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span>NumeroComplejo alloc<span class="br0">&#93;</span> initWithParteReal<span class="sy0">:</span>4 ParteImaginaria<span class="sy0">:</span>5<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//9i+8</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>suma sumarNumeroComplejo<span class="sy0">:</span>complejo3<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//7i+5</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>suma restarNumeroComplejo<span class="sy0">:</span>complejo2<span class="br0">&#93;</span>;

&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//liberar memoria</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>complejo1 release<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>complejo2 release<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>complejo3 release<span class="br0">&#93;</span>;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">//suma no es liberada ya que es liberada automaticamente en el método sumarNumerosComplejos</span>
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>Bien eso es todo por esta lección, saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-2-metodos-y-miembros/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capítulo I: Objective-C. Lección 1: Conoce la sintaxis.</title>
		<link>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-1-conoce-la-sintaxis/</link>
		<comments>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-1-conoce-la-sintaxis/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 06:46:50 +0000</pubDate>
		<dc:creator>leg10n</dc:creator>
				<category><![CDATA[Aprender iOS]]></category>
		<category><![CDATA[Capítulo I]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://appsindex.com/?p=5</guid>
		<description><![CDATA[¿Qué es Objective-C? En la teoría Objective-C es una extensión orientada a objetos (POO) de la sintaxis de C, no se trata en sí de otro lenguaje, sino que se trata del bien conocido y viejo amigo C, solo que se le han agregado muchas cosas interesantes y útiles. Si bien en un principio es]]></description>
			<content:encoded><![CDATA[<h2>¿Qué es Objective-C?</h2>
<p>En la teoría Objective-C es una extensión orientada a objetos (POO) de la sintaxis de C, no se trata en sí de otro lenguaje, sino que se trata del bien conocido y viejo amigo C, solo que se le han agregado muchas cosas interesantes y útiles. Si bien en un principio es cierto, la realidad es que debes acostumbrarte a las características de Objective-C.</p>
<h2>@interface</h2>
<p>La definición de la clase se realiza en el archivo de cabecera, que debe terminar en &#8220;.h&#8221;, como en C normal.</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">//MiClase.h</span>
<span class="co1">#import </span>

<span class="kw4">typedef</span> <span class="kw2">enum</span> <span class="br0">&#123;</span> rojo<span class="sy0">=</span>0,azul,verde <span class="br0">&#125;</span>Color;

<span class="kw1">@interface</span> MiClase <span class="sy0">:</span> <a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/"><span class="kw5">NSObject</span></a> <span class="br0">&#123;</span>
<span class="coMULTI">/* Comentario estilo C: definición de miembros */</span>
&nbsp;<span class="kw4">int</span> enteroA;
&nbsp;<span class="kw4">int</span> enteroB;
<span class="br0">&#125;</span>

<span class="co2">//Definición de métodos</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> getEnteroA<span class="sy0">:</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> setEnteroA<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> _entero;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> getEnteroB<span class="sy0">:</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> setEnteroB<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> _entero;
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> multiplicaEnteros;
<span class="sy0">+</span><span class="br0">&#40;</span><span class="kw4">char</span><span class="sy0">*</span><span class="br0">&#41;</span> nombreDeColor<span class="sy0">:</span><span class="br0">&#40;</span>Color<span class="br0">&#41;</span> color;
<span class="kw1">@end</span></div>
</div>
</pre>
<p>¿Cómo se ve una clase en Objective-C? Para alguien que viene de Java o C/C++ se ve familiar, pero a la vez, se desconocen varias cosas, la primera, definición de clases:</p>
<ul>
<li>Se comienza con la palabra reservada <em><span style="color: #339966;">@interface</span></em>.</li>
<li><span style="color: #339966;">NSObject</span>: Es la abreviación de NeXTStep Object, es la clase mas abstracta que hay, todas las clases deben heredar de otra clase o de NSObject.</li>
<li>La herencia se indica con <span style="color: #339966;"><em>Clase : ClasePadre</em></span>, como en <span style="color: #339966;"><em>MiClase : NSObject</em></span>.</li>
<li>Las variables de instancia se declaran entre las llaves de <span style="color: #339966;"><em>@interface Clase : NSObject { &#8230; }</em></span>.</li>
<li>El acceso por defecto es <span style="color: #339966;"><em>protected</em></span>.</li>
<li>Después de los miembros de la clase se especifican los métodos, que tienen la forma: <em><span style="color: #339966;">alcance (tipoDeRetorno) nombreDeMetodo:(tipoParametro1) parametro1</span></em>:</li>
<li>El alcance de un método se especifica con un signo menos: &#8211; para métodos de instancia; y un signo más + para metodos de clase.</li>
<li>La definición termina con<span style="color: #339966;"> <em>@end</em></span>.</li>
</ul>
<h2>@implementation</h2>
<p>La implementación de la clase se escribirá en un archivo con terminación &#8220;.m&#8221;:</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co2">//MiClase.m</span>
<span class="co1">#import &quot;MiClase.h&quot;</span>
<span class="kw1">@implementation</span> MiClase
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> getEnteroA
<span class="br0">&#123;</span>
&nbsp;<span class="kw1">return</span> enteroA;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> setEnteroA<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> _entero
<span class="br0">&#123;</span>
enteroA<span class="sy0">=</span>_entero;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> getEnteroB
<span class="br0">&#123;</span>
&nbsp;<span class="kw1">return</span> enteroB;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">void</span><span class="br0">&#41;</span> setEnteroB<span class="sy0">:</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> _entero
<span class="br0">&#123;</span>
enteroB<span class="sy0">=</span>_entero;
<span class="br0">&#125;</span>
<span class="sy0">-</span><span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span> multiplicaEnteros <span class="br0">&#123;</span>
&nbsp;<span class="kw1">return</span> enteroA<span class="sy0">*</span>enteroB;
<span class="br0">&#125;</span>
<span class="sy0">+</span><span class="br0">&#40;</span><span class="kw4">char</span><span class="sy0">*</span><span class="br0">&#41;</span> nombreDeColor<span class="sy0">:</span><span class="br0">&#40;</span>Color<span class="br0">&#41;</span> color
<span class="br0">&#123;</span>
&nbsp;<span class="kw1">switch</span><span class="br0">&#40;</span>color<span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; <span class="kw1">case</span> azul<span class="sy0">:</span>
&nbsp; &nbsp;<span class="kw1">return</span> <span class="st0">&quot;Azul&quot;</span>;
&nbsp; <span class="kw2">break</span>;
&nbsp; <span class="kw1">case</span> rojo<span class="sy0">:</span>
&nbsp; &nbsp;<span class="kw1">return</span> <span class="st0">&quot;Rojo&quot;</span>;
&nbsp; <span class="kw2">break</span>;
&nbsp; <span class="kw1">case</span> verde<span class="sy0">:</span>
&nbsp; &nbsp;<span class="kw1">return</span> <span class="st0">&quot;Verde&quot;</span>;
&nbsp; <span class="kw2">break</span>;
&nbsp;<span class="br0">&#125;</span>
<span class="kw1">return</span> <span class="st0">&quot;Color Desconocido&quot;</span>;
<span class="br0">&#125;</span>
<span class="kw1">@end</span></div>
</div>
</pre>
<p>La implementación de la clase</p>
<ul>
<li>Se comienza con <em><span style="color: #339966;">@implementation NombreDeClase</span></em>.</li>
<li>La definición de los métodos se realiza de manera similar a como se hizo la definición en la cabecera de la clase.</li>
<li>Se termina con la palabra reservada <em><span style="color: #339966;">@end</span></em>.</li>
</ul>
<h2>Usando la clase.</h2>
<p>Como ya mencioné, Objective-C es una extensión de C, y sabemos que todo programa de C, debe tener una función main:</p>
<pre>
<div class="codesnip-container" >
<div class="objc codesnip" style="font-family:monospace;"><span class="co1">#import </span>
<span class="co1">#import &quot;MiClase.h&quot;</span>
<span class="kw4">int</span> main<span class="br0">&#40;</span> <span class="kw4">int</span> argc, <span class="kw4">const</span> <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>

&nbsp; &nbsp; MiClase <span class="sy0">*</span>instancia <span class="sy0">=</span> <span class="br0">&#91;</span><span class="br0">&#91;</span>MiClase alloc<span class="br0">&#93;</span> init<span class="br0">&#93;</span>;

&nbsp; &nbsp; <span class="co2">//Debemos especificar los valores:</span>
&nbsp; &nbsp; <span class="br0">&#91;</span>instancia setEnteroA<span class="sy0">:</span>1<span class="br0">&#93;</span>;
&nbsp; &nbsp; <span class="br0">&#91;</span>instancia setEnteroB<span class="sy0">:</span>12<span class="br0">&#93;</span>;

&nbsp; &nbsp; <span class="co2">//llamamos a los métodos de la instancia que devuelven valores</span>
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%d por %d es igual a %d&quot;</span>,<span class="br0">&#91;</span>instancia getEnteroA<span class="br0">&#93;</span>,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>instancia getEnteroB<span class="br0">&#93;</span>, <span class="br0">&#91;</span>instancia multiplicaEnteros<span class="br0">&#93;</span> <span class="br0">&#41;</span>;

&nbsp; &nbsp; <span class="co2">//tenemos que liberar la memoria cuando ya no necesitamos la instancia</span>
&nbsp; &nbsp; <span class="br0">&#91;</span>instancia release<span class="br0">&#93;</span>;

&nbsp; &nbsp; <span class="co2">//Pero podemos llamar a los métodos de la clase:</span>
&nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">&quot;%s&quot;</span>,<span class="br0">&#91;</span>MiClase nombreDeColor<span class="sy0">:</span>rojo<span class="br0">&#93;</span><span class="br0">&#41;</span>;
&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span>;
<span class="br0">&#125;</span></div>
</div>
</pre>
<ul>
<li>Las llamadas a métodos de una clase, de una manera equivalente a C++ <em><span style="color: #339966;">instancia-&gt;metodo()</span></em> se hace en la forma <em><span style="color: #339966;">[instancia metodo];<br />
</span></em></li>
<li>Se puede hacer llamadas anidadas: <em><span style="color: #339966;">[[instancia metodoQueDevuelveOtroObjeto] llamadaAMetodoDelObjetoDevuelto]</span></em> .sería el equivalente a lo siguiente en C++: <em><span style="color: #339966;">(instancia-&gt;metodoQueDevuelveOtroObjeto())-&gt;llamadaAMetodoDelObjetoDevuelto();</span></em></li>
<li>Para Crear instancias de una clase se usa <em><span style="color: #339966;">MiClase *instancia=[[MiClase alloc] init];</span></em></li>
<li>A diferencia de C++, Objective-C siempre utiliza apuntadores para objetos de las clases.</li>
<li>Para obtener la instancia de la clase la llamada al Método <em><span style="color: #339966;">alloc</span></em>, es como usar malloc en c, solo reserva la memoria para la instancia.</li>
<li>La llamada al método <em><span style="color: #339966;">init</span></em>, efectúa al inicialización de la instancia, como un constructor.</li>
<li>Usualmente se efectua en una sola línea para crear e inicializar el objeto:<em> <span style="color: #339966;">MiClase *instancia=[[MiClase alloc] init];</span></em></li>
<li> Al igual que en las otras variantes de C, debes liberar la memoria obtenida con <em><span style="color: #339966;">alloc</span></em>, llamando al método <span style="color: #339966;"><em>release</em></span>, que es heredado de <em><span style="color: #339966;">NSObject</span></em>.</li>
</ul>
<p>Bien, eso es todo por hoy. Saludos.</p>
]]></content:encoded>
			<wfw:commentRss>http://appsindex.com/2011/01/capitulo-i-objective-c-leccion-1-conoce-la-sintaxis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

