<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Webclaudio Blog</title>
	<atom:link href="http://webclaudio.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://webclaudio.wordpress.com</link>
	<description>Tudo que você queria saber, mas não tinha para quem perguntar!</description>
	<lastBuildDate>Fri, 25 Nov 2011 01:06:41 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='webclaudio.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Webclaudio Blog</title>
		<link>http://webclaudio.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://webclaudio.wordpress.com/osd.xml" title="Webclaudio Blog" />
	<atom:link rel='hub' href='http://webclaudio.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Curso de programação para IPHONE – Parte 12</title>
		<link>http://webclaudio.wordpress.com/2009/07/26/curso-de-programacao-para-iphone-%e2%80%93-parte-12/</link>
		<comments>http://webclaudio.wordpress.com/2009/07/26/curso-de-programacao-para-iphone-%e2%80%93-parte-12/#comments</comments>
		<pubDate>Sun, 26 Jul 2009 19:51:17 +0000</pubDate>
		<dc:creator>webclaudio</dc:creator>
				<category><![CDATA[DESENVOLVIMENTO]]></category>
		<category><![CDATA[IPHONE]]></category>

		<guid isPermaLink="false">http://webclaudio.wordpress.com/?p=457</guid>
		<description><![CDATA[Olá pessoal. Neste capítulo vou aproveitar a dúvida do meu amigo Herbert Moraes  sobre Tab Bar e apresentar um tutorial de como manipular este componente. Espero que gostem. Manipulando Tab Bar SOURCE TesteBarraAppDelegate.h // //  TesteBarraAppDelegate.h //  TesteBarra // //  Created by Luís Cláudio on 26/07/09. //  Copyright __MyCompanyName__ 2009. All rights reserved. // #import [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=457&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal. Neste capítulo vou aproveitar a dúvida do meu amigo Herbert Moraes  sobre Tab Bar e apresentar um tutorial de como manipular este componente. Espero que gostem.</p>
<p><span id="more-457"></span></p>
<h3>Manipulando Tab Bar</h3>
<p style="text-align:center;"><object width="425" height="334"><param name="movie" value="http://www.dailymotion.com/swf/x9z7se"></param><param name="allowfullscreen" value="true"></param><param name="wmode" value="opaque"></param><embed src="http://www.dailymotion.com/swf/x9z7se" width="425" height="334" allowfullscreen="true" wmode="opaque"></embed></object></p>
<h4>SOURCE<br />
TesteBarraAppDelegate.h</h4>
<p>//<br />
//  TesteBarraAppDelegate.h<br />
//  TesteBarra<br />
//<br />
//  Created by Luís Cláudio on 26/07/09.<br />
//  Copyright __MyCompanyName__ 2009. All rights reserved.<br />
//</p>
<p>#import &lt;UIKit/UIKit.h&gt;</p>
<p>@interface TesteBarraAppDelegate : NSObject &lt;UIApplicationDelegate&gt; {<br />
UIWindow *window;<br />
IBOutlet UITabBarController *meuTabBarController;<br />
}</p>
<p>@property (nonatomic, retain) IBOutlet UIWindow *window;<br />
@property (nonatomic, retain) IBOutlet UITabBarController *meuTabBarController;</p>
<p>@end</p>
<h4>TesteBarraAppDelegate.m</h4>
<p>//<br />
//  TesteBarraAppDelegate.m<br />
//  TesteBarra<br />
//<br />
//  Created by Luís Cláudio on 26/07/09.<br />
//  Copyright __MyCompanyName__ 2009. All rights reserved.<br />
//</p>
<p>#import &#8220;TesteBarraAppDelegate.h&#8221;</p>
<p>@implementation TesteBarraAppDelegate</p>
<p>@synthesize window;<br />
@synthesize  meuTabBarController;</p>
<p>- (void)applicationDidFinishLaunching:(UIApplication *)application {</p>
<p>// Override point for customization after application launch<br />
[window addSubview:[meuTabBarController view]];<br />
[window makeKeyAndVisible];<br />
}</p>
<p>- (void)dealloc {<br />
[meuTabBarController release];<br />
[window release];<br />
[super dealloc];<br />
}</p>
<p>@end</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webclaudio.wordpress.com/457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webclaudio.wordpress.com/457/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webclaudio.wordpress.com/457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webclaudio.wordpress.com/457/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webclaudio.wordpress.com/457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webclaudio.wordpress.com/457/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webclaudio.wordpress.com/457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webclaudio.wordpress.com/457/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webclaudio.wordpress.com/457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webclaudio.wordpress.com/457/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webclaudio.wordpress.com/457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webclaudio.wordpress.com/457/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webclaudio.wordpress.com/457/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webclaudio.wordpress.com/457/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=457&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webclaudio.wordpress.com/2009/07/26/curso-de-programacao-para-iphone-%e2%80%93-parte-12/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5edb029e2cc8684b40fe9f5bf9deb8b7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">webclaudio</media:title>
		</media:content>
	</item>
		<item>
		<title>Curso de programação para IPHONE &#8211; Parte 11</title>
		<link>http://webclaudio.wordpress.com/2009/06/29/curso-de-programacao-para-iphone-parte-11/</link>
		<comments>http://webclaudio.wordpress.com/2009/06/29/curso-de-programacao-para-iphone-parte-11/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 04:03:54 +0000</pubDate>
		<dc:creator>webclaudio</dc:creator>
				<category><![CDATA[DESENVOLVIMENTO]]></category>

		<guid isPermaLink="false">http://webclaudio.wordpress.com/?p=450</guid>
		<description><![CDATA[Olá pessoal&#8230; Estamos de volta. E agora aprendendo a fazer nosso primeiro menu usando a tableview. Embaixo do vídeo segue o código para quem não quiser digitar. Um abraço&#8230; CRIANDO UM MENU COM TABLEVIEW Código rootviewcontroller.h // //  RootViewController.h //  Menu // //  Created by Luís Cláudio on 28/06/09. //  Copyright __MyCompanyName__ 2009. All rights [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=450&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-454" title="TITCAPITULO11" src="http://webclaudio.files.wordpress.com/2009/06/titcapitulo11.jpg?w=500&#038;h=150" alt="TITCAPITULO11" width="500" height="150" /></p>
<p>Olá pessoal&#8230; Estamos de volta.<br />
E agora aprendendo a fazer nosso primeiro menu usando a tableview. Embaixo do vídeo segue o código para quem não quiser digitar. Um abraço&#8230;</p>
<h3><span id="more-450"></span>CRIANDO UM MENU COM TABLEVIEW</h3>
<object width="425" height="334"><param name="movie" value="http://www.dailymotion.com/swf/x9ptcj"></param><param name="allowfullscreen" value="true"></param><param name="wmode" value="opaque"></param><embed src="http://www.dailymotion.com/swf/x9ptcj" width="425" height="334" allowfullscreen="true" wmode="opaque"></embed></object>
<p><em><strong>Código rootviewcontroller.h</strong></em></p>
<p>//<br />
//  RootViewController.h<br />
//  Menu<br />
//<br />
//  Created by Luís Cláudio on 28/06/09.<br />
//  Copyright __MyCompanyName__ 2009. All rights reserved.<br />
//</p>
<p>#import &lt;UIKit/UIKit.h&gt;</p>
<p>@interface RootViewController : UITableViewController {<br />
NSArray *menu;<br />
}</p>
<p>@end</p>
<p><em><strong>Código rootviewcontroller.m</strong></em></p>
<p>//<br />
//  RootViewController.m<br />
//  Menu<br />
//<br />
//  Created by Luís Cláudio on 28/06/09.<br />
//  Copyright __MyCompanyName__ 2009. All rights reserved.<br />
//</p>
<p>#import &#8220;RootViewController.h&#8221;<br />
#import &#8220;MenuAppDelegate.h&#8221;<br />
#import &#8220;Tela1ViewController.h&#8221;</p>
<p>@implementation RootViewController</p>
<p>- (void)viewDidLoad {<br />
self.title= @&#8221;Meu primeiro Menu&#8221;;<br />
menu = [[NSArray alloc] initWithObjects: @&#8221;Entrada&#8221;, @&#8221;Ida para Almoço&#8221;,@&#8221;Retorno do Almoço&#8221;,@&#8221;Saída&#8221;,nil];</p>
<p>[super viewDidLoad];</p>
<p>// Uncomment the following line to display an Edit button in the navigation bar for this view controller.<br />
// self.navigationItem.rightBarButtonItem = self.editButtonItem;<br />
}</p>
<p>/*<br />
- (void)viewWillAppear:(BOOL)animated {<br />
[super viewWillAppear:animated];<br />
}<br />
*/<br />
/*<br />
- (void)viewDidAppear:(BOOL)animated {<br />
[super viewDidAppear:animated];<br />
}<br />
*/<br />
/*<br />
- (void)viewWillDisappear:(BOOL)animated {<br />
[super viewWillDisappear:animated];<br />
}<br />
*/<br />
/*<br />
- (void)viewDidDisappear:(BOOL)animated {<br />
[super viewDidDisappear:animated];<br />
}<br />
*/</p>
<p>// Override to allow orientations other than the default portrait orientation.<br />
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {<br />
// Return YES for supported orientations<br />
return YES;<br />
}</p>
<p>- (void)didReceiveMemoryWarning {<br />
[super didReceiveMemoryWarning]; // Releases the view if it doesn&#8217;t have a superview<br />
// Release anything that&#8217;s not essential, such as cached data<br />
}</p>
<p>#pragma mark Table view methods</p>
<p>- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {<br />
return 1;<br />
}</p>
<p>// Customize the number of rows in the table view.<br />
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {<br />
return [menu count];<br />
}</p>
<p>// Customize the appearance of table view cells.<br />
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {</p>
<p>static NSString *CellIdentifier = @&#8221;Cell&#8221;;</p>
<p>UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];<br />
if (cell == nil) {<br />
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];<br />
}</p>
<p>// Set up the cell&#8230;<br />
NSInteger row = indexPath.row;<br />
cell.text = [menu objectAtIndex:row];</p>
<p>return cell;<br />
}</p>
<p>- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {<br />
// Navigation logic may go here. Create and push another view controller.<br />
MenuAppDelegate *delegate = [[UIApplication sharedApplication] delegate];</p>
<p>Tela1ViewController *anotherViewController = [[Tela1ViewController alloc] initWithNibName:@&#8221;Tela1&#8243; bundle:nil];<br />
[delegate.navigationController pushViewController:anotherViewController animated:YES];<br />
[anotherViewController release];<br />
}</p>
<p>/*<br />
// Override to support conditional editing of the table view.<br />
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {<br />
// Return NO if you do not want the specified item to be editable.<br />
return YES;<br />
}<br />
*/</p>
<p>/*<br />
// Override to support editing the table view.<br />
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {</p>
<p>if (editingStyle == UITableViewCellEditingStyleDelete) {<br />
// Delete the row from the data source<br />
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];<br />
}<br />
else if (editingStyle == UITableViewCellEditingStyleInsert) {<br />
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view<br />
}<br />
}<br />
*/</p>
<p>/*<br />
// Override to support rearranging the table view.<br />
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {<br />
}<br />
*/</p>
<p>/*<br />
// Override to support conditional rearranging of the table view.<br />
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {<br />
// Return NO if you do not want the item to be re-orderable.<br />
return YES;<br />
}<br />
*/</p>
<p>- (void)dealloc {<br />
[super dealloc];<br />
}</p>
<p>@end</p>
<p>Abraços e até a próxima aula.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webclaudio.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webclaudio.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webclaudio.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webclaudio.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webclaudio.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webclaudio.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webclaudio.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webclaudio.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webclaudio.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webclaudio.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webclaudio.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webclaudio.wordpress.com/450/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webclaudio.wordpress.com/450/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webclaudio.wordpress.com/450/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=450&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webclaudio.wordpress.com/2009/06/29/curso-de-programacao-para-iphone-parte-11/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5edb029e2cc8684b40fe9f5bf9deb8b7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">webclaudio</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/06/titcapitulo11.jpg" medium="image">
			<media:title type="html">TITCAPITULO11</media:title>
		</media:content>
	</item>
		<item>
		<title>OBJECTIVE-C TUTORIAL</title>
		<link>http://webclaudio.wordpress.com/2009/05/21/objective-c-tutorial/</link>
		<comments>http://webclaudio.wordpress.com/2009/05/21/objective-c-tutorial/#comments</comments>
		<pubDate>Thu, 21 May 2009 01:24:55 +0000</pubDate>
		<dc:creator>webclaudio</dc:creator>
				<category><![CDATA[OBJECTIVE-C]]></category>

		<guid isPermaLink="false">http://webclaudio.wordpress.com/?p=423</guid>
		<description><![CDATA[Olá pessoal. Percebendo a necessidade de algumas pessoas em entender alguns conceitos do Objective-C, estou disponibilizando este tutorial feito por Alberto Martins que encontrei na net. Divirtam-se&#8230; Antes de começar este tutorial gostaria de responder a uma pegunta do Arthur Lopes: O asterisco no Objective-C tem uma função especial. Ele define a variável como um [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=423&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2><span style="font-family:arial,helvetica;"><strong><span style="font-family:arial,helvetica;font-size:medium;"><img class="size-full wp-image-436 alignleft" title="Objc" src="http://webclaudio.files.wordpress.com/2009/05/objc.png?w=110&#038;h=106" alt="Objc" width="110" height="106" /></span></strong></span></h2>
<h2><span style="font-family:arial,helvetica;"><strong></strong></span></h2>
<h2><span style="font-family:arial,helvetica;"><strong></strong></span></h2>
<h2><span style="font-family:arial,helvetica;"><strong></strong></span></h2>
<h2><span style="font-family:arial,helvetica;"><strong></strong></span></h2>
<h2><span style="font-family:arial,helvetica;"><strong></strong></span></h2>
<p><span style="font-family:arial,helvetica;"><span style="font-family:arial,helvetica;font-size:small;">Olá pessoal. Percebendo a necessidade de algumas pessoas em entender alguns conceitos do Objective-C, estou disponibilizando este tutorial feito por  Alberto Martins que encontrei na net. Divirtam-se&#8230;</span></span></p>
<p><span id="more-423"></span></p>
<p><span style="font-family:arial,helvetica;"><span style="font-family:arial,helvetica;font-size:small;">Antes  de  começar  este  tutorial  gostaria  de  responder a  uma pegunta do Arthur Lopes:<br />
O asterisco no Objective-C tem uma função especial. Ele define a variável como um ponteiro. Os ponteiros são concebidos para armazenar endereços de memória. Com um ponteiro você pode indiretamente manipular os dados armazenados em outras variáveis. Ou seja você cria aquela variável com a referência para outro objeto. Enquanto sem asterisco você cria variáveis por valor.</span></span></p>
<p>Ex:<br />
NSArray foo;</p>
<p>Você não deve dizer que foo é um NSArray. Ainda. Ele está apenas pronto para apontar para um (e nesse momento está apontando para NULL &#8220;nulo&#8221;), até você fazer isto:</p>
<p>foo = new NSArray(&#8230;)</p>
<p>Agora foo está apontando para um objeto NSArray.</p>
<p>Você pode ter ponteiros para tipos básicos:</p>
<p>int i = 5; // i é um tipo integer básico<br />
int* x; // x é um PONTEIRO para um integer<br />
x = &amp;i; // x agora aponta para o mesmo espaço de memória que &#8220;i&#8221; está.</p>
<p>Agora nós podemos referenciar o ponteiro  &#8220;x&#8221; e usar ele para mudar o valor de &#8220;i&#8221;.</p>
<p>*x = 7; // atribui o valor da variável onde o ponteiro está apontando, para 7</p>
<p>Espero que ajude. Qualquer dúvida procure por &#8220;Tipo valor, Tipo referência&#8221; no google que vai ter bastante material.</p>
<p>Vamos ao tuto..</p>
<p><span style="font-family:arial,helvetica;"><strong></strong></span></p>
<h2><span style="font-family:arial,helvetica;"><strong><span style="font-family:arial,helvetica;font-size:medium;"><br />
Objective-C</span></strong></span></h2>
<ul><span style="font-family:arial,helvetica;"> <span style="font-family:arial,helvetica;color:#888888;">Uma iniciação aos conceitos e à linguagem<br />
por Alberto Martins &#8211; <a href="mailto:algol@astro.iagusp.br">algol@astro.iagusp.br</a><br />
</span> </span></ul>
<h3><span><span style="font-family:arial,helvetica;">Introdução</span></span></h3>
<ul><span style="font-family:arial,helvetica;">Este breve tutorial foi criado para suprir a falta de informação sobre a linguagem Objective-C no Brasil, e com isso incentivar sua popularização. Para aqueles que já programam em C, a adaptação ao paradigma de orientação à objetos por meio da linguagem Objective-C ocorre de forma simples e natural, visto que sintaticamente apenas poucas construções são adicionadas. Observamos que no momento este não é um tutorial completo, ou seja, conhecer um pouco de C será não apenas de grande valia, como praticamente necessário para construir programas mais complexos. Devemos salientar também que por enquanto não iremos utilizar o framework &#8220;Foundation&#8221;, nem qualquer outro, nos mantendo nos rudimentos da linguagem.A linguagem Objective-C foi criada por Brad Cox e sua empresa, a StepStone Corporation, no início da década de 80. Em 88 ela foi licenciada pela NeXT, tornando-se a linguagem de desenvolvimento do NeXTstep. O suporte do GNU/gcc foi acrescentado em 1992. Em 1994 as empresas NeXT Computer e Sun Microsystems criaram uma especificação do NeXTstep conhecida como OpenStep. A implementação da Free Software Foundation da especificação OpenStep é denominada GNUStep.</p>
<p>Atualmente Objective-C é utilizada como a principal linguagem de programação do MacOS X, que é baseado no NeXTstep. A versão da Apple do ambiente NeXTStep/GNUStep com adições é denominada Cocoa.</p>
<p></span></ul>
<h3><span style="font-family:arial,helvetica;">Características</span></h3>
<ul><span style="font-family:arial,helvetica;"><strong></strong></span><span style="font-family:arial,helvetica;">Objective-C é apenas um conjunto de adições à linguagem C. Ela dá ao C suporte à construções orientadas a objetos como as da Smalltalk.<br />
</span></p>
<p><span style="font-family:arial,helvetica;">Objective-C suporta polimorfismo, posing, categorias, e é uma linguagem dinâmica, com typing e binding dinâmicos. Com Objective-C você pode adicionar classes e categorias em tempo de execução de forma fácil. E tudo isso com uma sintaxe de mensagem simples e elegante: olhe os títulos destas subseções e você já saberá como conversar com os objetos!<br />
</span></p>
<p><span style="font-family:arial,helvetica;">Objective-C realiza chamadas de mensagem dinâmicas rapidamente, entre 1,5 e 2,0 vezes  o tempo de uma chamada de função em C.</span></ul>
<h3><span style="font-family:arial,helvetica;">Programação Orientada à Objetos<br />
</span></h3>
<ul><span style="font-family:arial,helvetica;">O conceito de orientação à objetos é na verdade algo muito simples. Diariamente utilizamos objetos para realizar tarefas, e programar OO não é nada alem disso.Programadores mais antigos estão acostumados a pensar a programação separando dados e fuções que seriam aplicadas neles. A própria forma de pensar era diferente; para alguns problemas era óbvia a necessidade de uma integração maior entre os dados e as funções, e isto foi o aparecimento do objeto.</p>
<p>Tomando um exemplo simples: supomos que você possua uma televisão. A não ser que você seja um milhonário ou um professor pardal, essa televisão deve ter saído de uma linha de montagem, sendo assim igual a muitos outros aparelhos do mesmo modelo. Entretanto essa é a sua televisão, e ela possui um número de identificação (ou número serial) único.</p>
<p>No exemplo acima e agora traduzindo para o conceito de OO, sua televisão é uma <span style="font-weight:bold;">instância</span> da <span style="font-weight:bold;">classe</span> televisão. E cada vez que uma nova televisão é produzido, uma nova instância da classe televisão é criada.</p>
<p>Existem também certas coisas que você pode fazer com a sua televisão, como ligar e desligar, modificar o volume e configurações de cor, ligar o PIP, etc. As funções realizadas com a televisão, em OO, denominam-se <span style="font-weight:bold;">métodos</span>. Em alguns casos os métodos são aplicados na instância da classe, em outros eles são aplicados na classe em si. Por exemplo, ligar a televisão seria um <span style="font-weight:bold;">método de instância</span> e descobrir quantos televisores foram produzidos por um determinado fabricante seria um <span style="font-weight:bold;">método de classe</span>.</p>
<p>Quando vamos comprar um televisor em alguma loja, costumamos encontrá-los agrupados junto com tocadores de DVD, por exemplo. Bem, isso não se dá por acaso: televisores, assim como tocadores de DVD são eletrônicos, e com isso possuem características e funções em comum. Podemos então pensar nestes dois aparelhos como sendo instâncias de uma classe denominada eletrônicos. Entretanto não queremos instâncias da classe eletrônicos, e sim das classes televisão e toca-DVD, logo dizemos que as classes televisão e toca-DVD são <span style="font-weight:bold;">subclasses</span> (ou <span style="font-weight:bold;">classes filhas</span>) da <span style="font-weight:bold;">superclasse</span> (ou <span style="font-weight:bold;">classe pai</span>) eletrônicos. Esse é um conceito muito importante em orientação à objetos, e é denominado <span style="font-weight:bold;">herança</span>: quando criamos uma subclasse ela herda as características e métodos de sua superclasse. Nesse caso podemos dizer que nunca iremos criar uma instância da classe eletrônicos, logo esta é denominada uma <span style="font-weight:bold;">classe abstrata</span>, ou seja, uma classe que serve apenas para ser superclasse de outras classes.</p>
<p></span></ul>
<h3><span><span style="font-family:arial,helvetica;">Ambiente de programação</span></span></h3>
<ul><span style="font-family:arial,helvetica;">Para programar em Objective-C, tal como em qualquer outra linguagem moderna, você precisa de um editor e um compilador. Ambos estão disponíveis gratuitamente em muitos dos sistemas operacionais atuais.No MacOS X, você deve instalar os &#8220;Developer Tools&#8221; gratuitos da Apple, caso eles não estejam presentes no seu sistema. Essas ferramentas incluem dentre muitas outras coisas o compilador gcc e um ambiente de programação extremamente eficiente, denominado Xcode.</p>
<p>No Linux você já deve ter o gcc instalado, bem como muitos editores de texto (vi, pico, emacs). Você tambem pode utilizar algum ambiente de programação, como o KDevelop ou ferramentas GNUStep.</p>
<p>No Windows você pode instalar o compilador Objective-C que acompanha o sistema MinGW (<a href="http://www.mingw.org/">http://www.mingw.org</a>). Para escrever os códigos, qualquer editor de texto puro, como o Notepad, ou algum ambiente de programação devem servir.</p>
<p>Nos três sistemas, compilar um programa utilizando a linha de comando resume-se ao gcc (para projetos maiores costuma-se utilizar ferramentas como make, automake, etc), cujo formato geral de chamada é:</p>
<pre class="pseudocode">gcc arquivos.m -o nome_do_programa -l objc</pre>
<p>Os arquivos de código da linguagem Objective-C possuem sufixo &#8220;.m&#8221;, enquanto que os cabeçários possuem, como em C, sufixo &#8220;.h&#8221;.</p>
<p>Por algum motivo alguem na FSF não parece gostar muito de uma diretriz de pré-processamento (mais sobre isso depois) do Objetive-C denominada &#8220;#import&#8221;, que serve para substituir &#8220;#include&#8221; de forma a não ser necessário escrever &#8220;#ifndef #define #endif&#8221; para não incluir o mesmo arquivo várias vezes, e com isso as versões do gcc utilizadas em computadores com Linux e Windows dão &#8220;Warnings&#8221; na hora de compilar. Para acabar com esse problema, utilize a chamada do gcc com &#8220;-Wno-import&#8221;. Computadores com o gcc fornecido pela Apple não sofrem desse problema.</p>
<p>Para compilar programas utilizando o Xcode da Apple você deve criar um novo projeto do tipo &#8220;Cocoa Application&#8221; e sobrescrever o arquivo &#8220;main.m&#8221; que será criado automaticamente.</p>
<p></span></ul>
<h3><span><span style="font-family:arial,helvetica;">Meu primeiro programa: classes, objetos e métodos</span></span></h3>
<ul><span style="font-family:arial,helvetica;">Nesta seção vamos implementar um programa básico, já utilizando conceitos de programação orientada à objetos.Os programas em Objective-C possuem quatro partes bem definidas . A primeira define diretrizes para o pré-processador, a segunda define as classes e métodos, a terceira a implementa os métodos e a quarta é o programa em si. Mais tarde mostraremos como cada parte pode ficar armazenada em um arquivo separado, facilitando a organização do programa em si.</p>
<p>Para facilitar, podemos iniciar lendo o programa a seguir que define nossa primeira classe, o Gato. Esse dócil animal mia, logo vamos implementar uma classe &#8220;Gato&#8221; que possui um método chamado &#8220;miau&#8221; que serve apenas para escrever &#8220;Miaau!&#8221; na tela. Veja o código:</p>
<p>meuGato.m</p>
<p></span></p>
<pre class="code"><span style="color:#33cc00;"><span style="font-family:arial,helvetica;">//</span></span><span style="font-family:arial,helvetica;"><br style="color:#33cc00;" /><span style="color:#33cc00;">// Programa Gato</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// </span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de ObjC</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

<span style="color:#33cc00;">// aqui comecam as diretrizes do pre-processador</span>
#import &lt;stdio.h&gt;
#import &lt;objc/Object.h&gt;

<span style="color:#33cc00;">// aqui comeca a definicao das interfaces</span>
@interface Gato: Object

-(void) miau;

@end

<span style="color:#33cc00;">// aqui comecam as implementacoes dos metodos</span>
@implementation Gato

-(void) miau
{
        printf("Miaau!\n");
}

@end

<span style="color:#33cc00;">// aqui comeca o programa</span>
int main( int argc, const char *argv[] )
{
        Gato *meuGato;

        meuGato = [Gato alloc];
        meuGato = [meuGato init];

        [meuGato miau];

        [meuGato free];

        return 0;
}</span></pre>
<p><span style="font-family:arial,helvetica;"><br />
Todas as linhas que iniciam por &#8220;<span style="color:#33cc00;">//</span>&#8221; são linhas de comentários. Estas são ignoradas, logo é permitido escrever qualquer coisa após as duas barras. Comentários são utilizados para documentar um programa, facilitando sua compreensão.</span></p>
<p>Outra forma de inserir comentários em programas Objective-C é utilizar os caracteres &#8220;<span style="color:#33cc00;">/*<span style="color:#000000;">&#8221; no início do comentário e &#8220;</span></span><span style="color:#009900;">*/<span style="color:#000000;">&#8221; no final; desta forma pode-se criar blocos de comentário com muitas linhas, sem que seja necessário escrever &#8220;</span>//<span style="color:#000000;">&#8221; a cada linha nova.</span></span></p>
<p>As linhas iniciadas por &#8220;#&#8221; são diretrizes de pré-processamento. No programa acima utilizamos &#8220;#import &lt;&#8230;&gt;&#8221;, que diz para o compilador localizar, processar e importar informações dos arquivos &#8220;stdio.h&#8221; e &#8220;objc/Object.h&#8221;, ambos arquivos do sistema. Estes arquivos contém informações sobre a rotina &#8220;printf&#8221; e a classe &#8220;Object&#8221;, que foram utilizadas no nosso programa.</p>
<p>A segunda parte do arquivo consiste na definição das Classes e de suas interfaces. Quando nós definimos uma nova classe é necessário dizer ao compilador algumas coisas. A primeira delas é falar de onde a classe vem, ou seja quem é a sua superclasse. Utilizamos para isso a seção &#8220;@interface&#8221;, cujo formato geral é:</p>
<pre class="pseudocode">@interface NovaClasse: SuperClasse
{
        Declaração_de_variáveis;
}

Declaração_de_métodos;

@end</pre>
<p>No nosso programa definimos a classe &#8220;Gato&#8221;, que por enquanto não possui variáveis e apenas um método, o &#8220;miau&#8221;. Esse é um método da instância da classe &#8220;Gato&#8221; pois sua declaração é iniciada com o símbolo &#8220;-&#8221;. Poderíamos também criar um método da própria classe &#8220;Gato&#8221; utilizando o símbolo &#8220;+&#8221; para, por exemplo, contar o número de gatos que foram criados no programa.</p>
<p>Após o sinal &#8220;-&#8221; temos a declaração entre parênteses do que o método irá retornar; no caso, &#8220;void&#8221;, indica que nada será retornado. Finalmente temos o nome do método. Mais adiante forneceremos o formato geral de declaração de métodos.</p>
<p>A terceira parte do arquivo é a implementação dos métodos da classe. Ela define os métodos, ou seja contém seus códigos, declarados na parte &#8220;@interface&#8221;. O formato é:</p>
<pre class="pseudocode">@interface NovaClasse 

Definição_de_métodos;

@end</pre>
<p>A definição de um método nada mais é do que sua declaração sem o caractere &#8220;;&#8221; acompanhada por seu código, que é colocado entre chaves &#8220;{&#8221; e &#8220;}&#8221;. No nosso programa, o método &#8220;miau&#8221; tem o código definido por uma instrução da biblioteca &#8220;stdio.h&#8221; chamada &#8220;printf&#8221;, que serve para mostrar caracteres na tela.</p>
<p>A quarta e última parte do arquivo, é o programa em si. Esta parte contem a rotina denominada &#8220;main&#8221; que indica precisamente onde o programa deve iniciar sua execução. Ela inicia com a palavra &#8220;int&#8221;, especificando que &#8220;main&#8221; deve retornar um valor inteiro ao sistema quando terminar sua execução. As palavras que aparecem entre parêntesis &#8220;()&#8221; servem para lidar com argumentos passados pela linha de comando.</p>
<p>A primeira linha da rotina &#8220;main&#8221; define uma variável chamada &#8220;meuGato&#8221;, dizendo que &#8220;meuGato&#8221; é um objeto que guardará valores da classe &#8220;Gato&#8221;. O asterísco diz que &#8220;meuGato&#8221; é um ponteiro para um &#8220;Gato&#8221;.</p>
<p>Na segunda linha alocamos espaço na memória para o &#8220;meuGato&#8221;, e na terceira inicializamos as variáveis que podem estar presentes dentro do &#8220;meuGato&#8221;. Observe que na segunda linha passamos uma mensagem para a classe &#8220;Gato&#8221;, enquanto que na terceira a mensagem vai para a instância &#8220;meuGato&#8221;. Os métodos &#8220;alloc&#8221; e &#8220;init&#8221; não foram escritos por você, entretanto podemos utilizá-los pois foram definidos para a classe &#8220;Object&#8221;, que é a superclasse de &#8220;Gato&#8221;.</p>
<p>Na quarta linha passamos uma mensagem para o objeto &#8220;meuGato&#8221;, dizendo para ele miar, ou seja, executar o método &#8220;miau&#8221; que implementamos.</p>
<p>Na quinta linha passamos uma mensagem para &#8220;meuGato&#8221; dizendo que ele não será mais necessário, e que podemos liberar a memória que foi reservada à ele.</p>
<p>Na sexta linha especificamos o valor que o programa deve retornar ao sistema; no caso 0, indicando que tudo ocorreu bem.</p>
<p>Vamos finalmente compilar e executar o nosso programa. Para gerar o executável deve-se utilizar um compilador, no caso o gcc, e como visto anteriormente sua chamada (desta vez já com os nomes dos arquivos corretos) é:</p>
<pre class="code">gcc meuGato.m -o meuGato -l objc</pre>
<p>Executando o arquivo &#8220;meuGato&#8221; deve-se obter a seguinte saída:</p>
<pre class="output">Miaau!</pre>
<p><span style="font-weight:bold;">Um gato mais real&#8230;</span></p>
<p>Vejamos agora um programa um gato um pouco mais elaborado. Todos devemos concordar que os gatos possuem certas características, como cor do pêlo, tamanho, peso, etc. Logo está faltando algo ao nosso gato. No programa a seguir implementamos o peso, bem como funções para defini-lo e obtê-lo; fica para você a tarefa de implementar as outras características.</p>
<pre class="code"><span style="color:#33cc00;"><span style="font-family:arial,helvetica;">//
// Programa Gato com caracteristica</span></span><span style="font-family:arial,helvetica;"><br style="color:#33cc00;" /><span style="color:#33cc00;">// </span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de ObjC</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

<span style="color:#33cc00;">// aqui comecam as diretrizes do pre-processador</span>
#import &lt;stdio.h&gt;
#import &lt;objc/Object.h&gt;

<span style="color:#33cc00;">// aqui comeca a definicao das interfaces</span>
@interface Gato: Object
{
        double peso;
}

-(void) miau;
-(void) setPeso: (double) p;
-(double) getPeso;

@end

<span style="color:#33cc00;">// aqui comecam as implementacoes dos metodos</span>
@implementation Gato

-(void) miau
{
        printf("Miaau!\n");
}

-(void) setPeso: (double) p
{
        peso=p;
}

-(double) getPeso
{
        return peso;
}

@end

<span style="color:#33cc00;">// aqui comeca o programa</span>
int main( int argc, const char *argv[] )
{
        Gato *meuGato;
        Gato *meuGato2;

        meuGato = [[Gato alloc] init];
        meuGato2 = [[Gato alloc] init];

        [meuGato setPeso: 4.2];
        [meuGato2 setPeso: 4.9];
        [meuGato miau];
        [meuGato2 miau];
        printf("meuGato pesa: %lf kg\n",[meuGato getPeso]);
        printf("meuGato2 pesa: %lf kg\n",[meuGato2 getPeso]);

        [meuGato free];
        [meuGato2 free];

        return 0;
}</span></pre>
<p><span style="font-family:arial,helvetica;"><br />
A primeira adição no programa acima em relação ao original são as declarações dos métodos &#8220;setPeso&#8221; e &#8220;getPeso&#8221;. O primeiro recebe um valor real do tipo double, e o segundo retorna um valor tipo double. Estamos prontos para enunciar um formato geral de declaração de métodos:</span></p>
<pre class="pseudocode"><span style="font-family:arial,helvetica;">tipo_de_método(tipo_do_retorno_do_método) nome_do_método: (tipo_do_argumento) argumento;

exemplo de método de classe:

        +(int) quantosGatos;

exemplo de método de instância:

        -(void) setPeso: (double) p;</span></pre>
<p><span style="font-family:arial,helvetica;"><br />
Na parte de implementação temos as implementações de &#8220;setPeso&#8221; e &#8220;getPeso&#8221;.</span></p>
<p>Na rotina &#8220;main&#8221; podemos notar que estamos criando dois gatos diferentes. O primeiro pesa 4.2kg, enquanto que o segundo 4.9kg. Devemos observar que, de modo distinto do programa original,  estamos alocando memória e inicializando &#8220;meuGato&#8221; ao mesmo tempo. Essa é uma construção muito utilizada, junto com a alternativa seguinte:</p>
<pre class="pseudocode"><span style="font-family:arial,helvetica;">Gato *meuGato = [[Gato alloc] init];</span></pre>
<p><span style="font-family:arial,helvetica;"><br />
Podemos observar, ainda dentro da rotina &#8220;main&#8221;, como passar argumentos para o objeto &#8220;meuGato&#8221;, com o método setPeso. Ou também como obter o valor de uma característica do &#8220;meuGato&#8221;, com o método &#8220;getPeso&#8221; e imprimi-lo na tela com a função &#8220;printf&#8221;.</span></p>
<p>A saída agora deve ser:</p>
<pre class="output"><span style="font-family:arial,helvetica;">Miaau!
Miaau!
meuGato pesa: 4.200000 kg
meuGato2 pesa: 4.900000 kg</span></pre>
<p><span style="font-family:arial,helvetica;"> </span></ul>
<h3><span><span style="font-family:arial,helvetica;">Mais sobre classes, objetos, métodos</span></span></h3>
<ul><span style="font-family:arial,helvetica;">Na seção anterior vimos como passar um argumento para um método. Entretanto muitas vezes é desejável  poder passar mais do que um argumento por vez, por exemplo para definir a posição (x,y) de um ponto no R<sup>2</sup>. Felizmente existe um tipo de construção que nos permite fazê-lo:</p>
<pre class="pseudocode">-(tipo) nome: (tipo) variável nome: (tipo) variável;

exemplo, um método para definir as posições de um ponto no R<sup>2</sup>:

-(void) setX: (double) x andY: (double) y;

passando a mensagem:

[Objeto setX: 1.511 andY: 2.332];</pre>
<p>Geralmente é interessante  ter métodos para definir cada argumento separadamente, ainda que existam os métodos para definir múltiplos argumentos de uma só vez.</p>
<p>Um método também pode retornar um objeto. Por exemplo, poderíamos implementar um método de instância na classe &#8220;Gato&#8221; que definisse uma reprodução sexuada. Para isso temos que ter duas instâncias da classe &#8220;Gato&#8221; allocadas e inicializadas; uma para receber a mensagem e outra para ser o objeto a ser recebido como argumento da mensagem. Devemos ter também um objeto do tipo &#8220;Gato&#8221;, que armazenará o gato filho. Acompanhe a definição do método &#8220;reproduzir&#8221;:</p>
<pre class="code">&lt;novo método&gt;
-(Gato *) reproduzir: (Gato *) Gato2
{
        <span style="color:#33cc00;">// funcao para criar um gato filho com a media dos pesos dos pais</span><br style="color:#33cc00;" /><span style="color:#33cc00;">        // antes de algum protesto, nao estamos tentando ser biologicamente corretos!</span>

        Gato *Gatinho=[[Gato alloc] init];
        double pesoGatinho;

        pesoGatinho = (peso+[Gato2 getPeso])/2;

        [Gatinho setPeso: pesoGatinho];

        return Gatinho;
}

&lt;novo main&gt;
int main( int argc, const char *argv[] )
{
        Gato *meuGato = [[Gato alloc] init];
        Gato *meuGato2 = [[Gato alloc] init];
        Gato *meuGatoFilho;

        [meuGato setPeso: 4.2];
        [meuGato2 setPeso: 4.9];
        [meuGato miau];
        [meuGato2 miau];

        meuGatoFilho = [meuGato reproduzir: meuGato2];
        [meuGatoFilho miau];

        printf("meuGato pesa: %lf kg\n",[meuGato getPeso]);
        printf("meuGato2 pesa: %lf kg\n",[meuGato2 getPeso]);
        printf("meuGatoFilho pesa: %lf kg\n",[meuGatoFilho getPeso]);

        [meuGato free];
        [meuGato2 free];
        [meuGatoFilho free];

        return 0;
}</pre>
<p>Em Objective-C você pode se referir ao próprio objeto que está recebendo a mensagem, usando para isso a palavra &#8220;self&#8221;. Isso tem muitas utilidades, por exemplo para executar um método que precise executar outros métodos. Um exemplo não muito bom seria criar um método &#8220;comer&#8221; para o nosso gato que  utilizasse o método &#8220;setPeso&#8221; (como [self setPeso: 5]) para engordá-lo; nesse caso poderíamos alterar o valor de &#8220;peso&#8221; sem recorrer ao &#8220;self&#8221;, porém caso tivéssemos algum método que realizasse muitas tarefas isso seria de grande utilidade.</p>
<p>Agora uma dica de organização: tipicamente os programadores dividem suas classes em arquivos separados, nomeados &#8220;classe.h&#8221; e &#8220;classe.m&#8221;; o primeiro contém a seção &#8220;@interface&#8221; e o segundo &#8220;@implementation&#8221;. O arquivo de interface diz ao compilador como a sua classe é, enquanto que o arquivo de implementação contém o código verdadeiro da classe.</p>
<p>Para realizar ligar os diversos arquivos devemos compilar o programa de uma forma especial, bem como nos utilizar da diretriz de pré-processamento &#8220;#import&#8221;. Observe a nova implementação do programa do gato:</p>
<p>Gato.h</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Classe Gato - interface</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// </span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de ObjC</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import &lt;objc/Object.h&gt;

@interface Gato: Object
{
        double peso;
}

-(void) miau;
-(void) setPeso: (double) p;
-(double) getPeso;
-(Gato *) reproduzir: (Gato *) Gato2;

@end</pre>
<p>Gato.m</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Classe Gato - implementacao</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de Objc</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import &lt;stdio.h&gt;
#import "Gato.h"

@implementation Gato

-(void) miau
{
        printf("Miaau!\n");
}

-(void) setPeso: (double) p
{
        peso=p;
}

-(double) getPeso
{
        return peso;
}

-(Gato *) reproduzir: (Gato *) Gato2
{
<span style="color:#33cc00;">        // funcao para criar um gato filho com a media dos pesos dos pais</span><br style="color:#33cc00;" /><span style="color:#33cc00;">        // antes de algum protesto, nao estamos tentando ser biologicamente corretos!</span>

        Gato *Gatinho=[[Gato alloc] init];
        double pesoGatinho;

        pesoGatinho = (peso+[Gato2 getPeso])/2;

        [Gatinho setPeso: pesoGatinho];

        return Gatinho;
}

@end</pre>
<p>main.m</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Programa Gato com caracteristica</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// em multiplos arquivos</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de ObjC</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import &lt;stdio.h&gt;
#import "Gato.h"

int main( int argc, const char *argv[] )
{
        Gato *meuGato = [[Gato alloc] init];
        Gato *meuGato2 = [[Gato alloc] init];
        Gato *meuGatoFilho;

        [meuGato setPeso: 4.2];
        [meuGato2 setPeso: 4.9];
        [meuGato miau];
        [meuGato2 miau];

        meuGatoFilho = [meuGato reproduzir: meuGato2];
        [meuGatoFilho miau];

        printf("meuGato pesa: %lf kg\n",[meuGato getPeso]);
        printf("meuGato2 pesa: %lf kg\n",[meuGato2 getPeso]);
        printf("meuGatoFilho pesa: %lf kg\n",[meuGatoFilho getPeso]);

        [meuGato free];
        [meuGato2 free];
        [meuGatoFilho free];

        return 0;
}</pre>
<p>Preste especial atenção em como a diretiva &#8220;#import&#8221; é utilizada. O arquivo &#8220;Gato.h&#8221; precisa de informações sobre a classe &#8220;Object&#8221; que foi definida no arquivo &#8220;objc/Object.h&#8221;, e por isso devemos importá-lo em &#8220;Gato.h&#8221;. Já o arquivo &#8220;Gato.m&#8221; deve importar o arquivo de interface de sua classe, o &#8220;Gato.h&#8221;, bem como &#8220;stdio.h&#8221;, pois utiliza a função &#8220;printf&#8221;. Finalmente, o programa principal deve importar o arquivo &#8220;stdio.h&#8221; pela função &#8220;printf&#8221; e o arquivo &#8220;Gato.h&#8221; por instanciar objetos da classe &#8220;Gato&#8221;. Isso pode parecer um pouco confuso, mas na verdade o conceito é bastante simples: deve-se importar tudo o que for utilizar.</p>
<p>Para compilar programas com multiplos arquivos no gcc, use a seguinte linha de comando:</p>
<pre class="pseudocode">gcc arquivo1.m arquivo2.m main.m -o nome_do_programa -l objc</pre>
<p>no caso do nosso programa, use:</p>
<pre class="code">gcc Gato.m main.m -o gato -l objc</pre>
<p>execute o programa e veja o resultado; ele deve ser similar ao apresentado abaixo:</p>
<pre class="output">Miaau!
Miaau!
Miaau!
meuGato pesa: 4.200000 kg
meuGato2 pesa: 4.900000 kg
meuGatoFilho pesa: 4.550000 kg</pre>
<p></span></ul>
<h3><span><span style="font-family:arial,helvetica;">Herança</span></span></h3>
<ul><span style="font-family:arial,helvetica;">Nesta seção falaremos sobre um dos conceitos mais importantes da programação orientada a objetos: a herança.Uma classe pode ter a si mesma como superclasse, e essa classe, que não possui superclasse é denominada classe <span style="font-weight:bold;">raiz</span> (ou <span style="font-weight:bold;">root</span>). A classe raiz pode ser programada por você mesmo, ou então como é mais comum, ser a classe <span style="font-weight:bold;">Object</span>, descrita em &#8220;objc/Object.h&#8221; ou a classe <span style="font-weight:bold;">NSObject</span>, descrita em &#8220;Foundation/NSObject.h&#8221;.</p>
<p>A classe que foi criada neste tutorial é uma subclasse de Object, e com isso ela herda certos métodos, como free e outros que foram definidos para a classe Object. No entanto suponha que agora seja necessário criar um classe para cachorros. Bem, poderíamos criar uma subclasse de Object denominada Cachorro e implementar funções como setPeso e getPeso idênticas às da classe Gato. Uma solução melhor, seria criar uma subclasse de Object denominada Animal, e as classes Cachorro e Gato seriam subclasses da classe Animal, que por sua vez seria uma classe abstrata, visto que nunca iremos criar uma instância de Animal.</p>
<p>No exemplo abaixo fizemos justamente isso.</p>
<p>Animal.h</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Classe Abstrata Animal - interface</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de Objc</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import &lt;objc/Object.h&gt;

@interface Animal : Object
{
        double peso;
}

-(void) setPeso: (double) p;
-(double) getPeso;

@end</pre>
<p>Animal.m</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Classe Abstrata Animal - implementacao</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de Objc</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import "Animal.h"

@implementation Animal

-(void) setPeso: (double) p
{
        peso=p;
}

-(double) getPeso
{
        return peso;
}

@end</pre>
<p>Gato.h</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Classe Gato - interface</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de Objc</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import "Animal.h"

<span style="color:#33cc00;">// aqui comeca a definicao das interfaces</span>
@interface Gato: Animal

-(void) miau;

@end</pre>
<p>Gato.m</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Classe Gato - implementacao</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de Objc</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import "Gato.h"
#import &lt;stdio.h&gt;

<span style="color:#33cc00;">// aqui comecam as implementacoes dos metodos</span>
@implementation Gato

-(void) miau
{
        printf("Miaau!\n");
}

@end</pre>
<p>Cachorro.h</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Classe Cachorro - interface</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de Objc</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import "Animal.h"

<span style="color:#33cc00;">// aqui comeca a definicao das interfaces</span>
@interface Cachorro: Animal

-(void) auau;

@end</pre>
<p>Cachorro.m</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Classe Cachorro - implementacao</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de Objc</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import "Cachorro.h"
#import &lt;stdio.h&gt;

<span style="color:#33cc00;">// aqui comecam as implementacoes dos metodos</span>
@implementation Cachorro

-(void) auau
{
        printf("AuAu!\n");
}

@end</pre>
<p>main.m</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Programa de Animais com heranca</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de ObjC</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import &lt;stdio.h&gt;
#import "Gato.h"
#import "Cachorro.h"

<span style="color:#33cc00;">// aqui comeca o programa</span>
int main( int argc, const char *argv[] )
{
        Gato *meuGato = [[Gato alloc] init];
        Gato *meuGato2 = [[Gato alloc] init];
        Cachorro *meuCachorro = [[Cachorro alloc] init];
        Cachorro *meuCachorro2 = [[Cachorro alloc] init];

        [meuGato setPeso: 4.2];
        [meuGato2 setPeso: 4.9];
        [meuGato miau];
        [meuGato2 miau];

        printf("meuGato pesa: %lf kg\n",[meuGato getPeso]);
        printf("meuGato2 pesa: %lf kg\n",[meuGato2 getPeso]);

        [meuCachorro setPeso: 10.2];
        [meuCachorro2 setPeso: 13.3];
        [meuCachorro auau];
        [meuCachorro2 auau];

        printf("meuCachorro pesa: %lf kg\n",[meuCachorro getPeso]);
        printf("meuCachorro2 pesa: %lf kg\n",[meuCachorro2 getPeso]);

        [meuCachorro free];
        [meuCachorro2 free];
        [meuGato free];
        [meuGato2 free];

        return 0;
}</pre>
<p>Observe que no exemplo acima o método &#8220;reproduzir&#8221; nao existe mais. Optamos por não escrevê-lo, pois embora essa seja uma atividade comum para todos os animais a reprodução de animais diferentes deve gerar objetos de classes diferentes, e não um animal genérico da classe animal. Para contornar o problema você poderia escrever dois métodos, um para cada classe, denominados &#8220;reproduzir&#8221;, que embora partilhassem o mesmo nome seriam um pouco diferentes; afinal você não espera que um casal de cachorros gerem filhos gatos. Implementar um método comum exigirá um pouco mais de conhecimento, e isso será realizado na próxima seção, denominada <span style="font-weight:bold;">Polimorfismo, Typing dinâmico e Binding dinâmico</span>.</p>
<p>Suponha agora que você queira que o método getPeso para um gato retorne o peso em gramas  e não em quilos. Bem, você pode modificar a implementação original de getPeso na clase Animal, porém isso modificará também o retorno do getPeso para cachorros. Para solucionar este problema pode-se utilizar um conceito denominado <span style="font-weight:bold;">overriding</span>.</p>
<p><span style="font-weight:bold;">Overriding</span> é simplesmente sobrescrever um método. Quando você cria um método com o mesmo nome de um outro método que foi herdado pela classe, vale o método da classe e não o da superclasse. Logo, você poderia criar um método dentro da classe Gato com o mesmo nome (no caso, getPeso) e com isso apenas o método da classe Gato seria afetado, permitindo que a classe Cachorro continuasse retornando o peso em kilogramas. Experimente, realizando <span style="font-weight:bold;">overriding</span> de getPeso da classe Gato (não esqueça de modificar o printf da rotina main para escrever &#8220;g&#8221; ao invés de &#8220;kg&#8221;).</p>
<p>Dentro de classes podemos também instanciar objetos. Por exemplo, suponhamos que todos os animais (logo todas as subclasses da classe Animal &#8211; novamente, não estamos tentando ser biologicamente corretos!) tenham olhos. Podemos então, definir uma classe denominada Olho, e instanciá-la dentro da classe Animal. Observe a interface e implementação da classe Olho, bem como os novos arquivos da classe Animal.</p>
<p>Olho.h</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Classe Olho - interface</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de Objc</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import &lt;objc/Object.h&gt;

@interface Olho : Object
{
        int estado_da_pupila;
}

-(void) setEstado_Da_Pupila: (int) pupil;
-(void) printEstado_Da_Pupila;

@end</pre>
<p>Olho.m</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Classe Olho - implementacao</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de Objc</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import "Olho.h"

@implementation Olho

-(void) setEstado_Da_Pupila: (int) pupil
{
        if(pupil==0) estado_da_pupila=0;
        if(pupil==1) estado_da_pupila=1;
        if(pupil==2) estado_da_pupila=2;
}

-(void) printEstado_Da_Pupila
{
        if(estado_da_pupila==0)
        {
                printf("A pupila está contraída\n");
        }
        if(estado_da_pupila==1)
        {
                printf("A pupila está normal\n");
        }
        if(estado_da_pupila==2)
        {
                printf("A pupila está dilatada\n");
        }
}

@end</pre>
<p>Animal.h</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Classe Abstrata Animal - interface</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de Objc</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import &lt;objc/Object.h&gt;
#import "Olho.h"

@interface Animal : Object
{
        double peso;
        Olho *AOlho;
}

-(void) setPeso: (double) p;
-(double) getPeso;
-(void) printEstado_Da_Pupila;
-(void) setEstado_Da_Pupila: (int) edp;

@end</pre>
<p>Animal.m</p>
<pre class="code"><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// Classe Abstrata Animal - implementacao</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// por Alberto GOK Martins</span><br style="color:#33cc00;" /><span style="color:#33cc00;">// para o tutorial de Objc</span><br style="color:#33cc00;" /><span style="color:#33cc00;">//</span>

#import "Animal.h"

@implementation Animal

-(void) setPeso: (double) p
{
        peso=p;
}

-(double) getPeso
{
        return peso;
}

-(void) printEstado_Da_Pupila
{
<span style="color:#33cc00;">        // funcao para imprimir o estado da pupila de um animal</span>

        if(AOlho)
               [AOlho printEstado_Da_Pupila];
        else
                printf("Não foi definido um estado da pupila deste animal.\n");
}

-(void) setEstado_Da_Pupila: (int) edp
{
        [AOlho free];
        AOlho = [[Olho alloc] init];
        [AOlho setEstado_Da_Pupila: edp];
}

@end</pre>
<p>O código que deve ser utilizado para testar o funcionamento do Olho em main.m é:</p>
<pre class="code">[meuGato setEstado_Da_Pupila: 1];
[meuGato printEstado_Da_Pupila];</pre>
<p>Obtivemos agora um enorme problema. Como é que vamos liberar a memória alocada para o Olho do Animal? Como não podemos acessar diretamente o objeto AOlho não podemos liberar a memória sem criar um método pertencente à classe Animal específico para isso; ou então, como saída mais inteligente, realizar um overriding do método free.</p>
<p>Caso não liberemos a memória teremos um problema que se denomina vazamento de memória, ou <span style="font-weight:bold;">memory leakage</span>. Bem, para realizar o overriding de free precisamos saber como liberar a memória alocada pelo próprio objeto, no entanto como o método free é agora diferente do original ele não mais saberá como liberar a memória alocada para o objeto. A saída para isso é a instrução <span style="font-weight:bold;">super</span> que se refere a classe pai do recebedor da mensagem. <span style="font-weight:bold;">Super</span> chamará não o método da classe atual, mas aquele que foi herdado. Desta forma podemos sempre nos referir ao método antigo de todos os métodos que foram implementados através de overriding.</p>
<p>Logo a implementação do método free para a classe Animal deve ser:</p>
<pre class="code">-(id) free
{
        [AOlho free];
        return [super free];
}</pre>
<p>Deixaremos para nos preocupar com a palavra id na próxima seção</p>
<p></span></ul>
<h3><span><span style="font-family:arial,helvetica;">Polimorfismo, Typing dinâmico e Binding dinâmico</span></span></h3>
<ul><span style="font-family:arial,helvetica;">Polimorfismo é um conceito muito simples. Ele nada mais é do que a habilidade que uma linguagem orientada à objetos tem de definir métodos com o mesmo nome para classes diferentes. Cada definição de classe guarda o código necessário para seus métodos.Typing dinâmico é a característica que a linguagem tem de poder postergar a determinação da classe de um objeto até o tempo de execução do programa, enquanto que Biding dinâmico é poder postergar a determinação do método que será invocado em um objeto até o tempo de execução.</p>
<p>Para realizar o typing e o binding dinâmicos utiliza-se o tipo<span style="font-weight:bold;"> id</span>. Este é um tipo de objeto genérico, que pode ser utilizado para guardar objetos pertencentes a qualquer classe. Na seção anterior utilizamos o tipo id para realizar o overriding do método free. Vejamos agora, como implementar o método reproduzir na classe Animal, e permitir que a classe Gato e Cachorro se reproduzam, sem que seja necessário criar dois métodos distintos:</p>
<p></span></p>
<pre class="code"><span style="font-family:arial,helvetica;">-(id) reproduzir: (id) Animal2
{
<span style="color:#33cc00;">        // funcao para criar um animal filho com a media dos pesos dos pais</span><br style="color:#33cc00;" /><span style="color:#33cc00;">        // antes de algum protesto, nao estamos tentando ser biologicamente corretos!</span><br style="color:#33cc00;" /><span style="color:#33cc00;">        // existe um teste para verificar se os animais sao da mesma classe.</span>

        id Filho=[[[self class] alloc] init];

        if ([self class] == [Animal2 class])
        {
                printf("O filho nasceu sadio!\n");
                [Filho setPeso: (peso+[Animal2 getPeso])/2];
        }
		else
        {
                printf("O filho nasceu morto, pois os pais são de classes diferentes!\n");
                [Filho setPeso: 0];
        }
        return Filho;

}
</span></pre>
<p><span style="font-family:arial,helvetica;"><br />
Na implementação da função acima utilizamos o tipo id, pois não sabemos qual será a subclasse de Animal que será passada nem a classe que irá retornar. Utilizamos também a palavra self que serve para se referir ao próprio objeto, logo dizer [self class] é uma forma de pedir para o objeto retornar a própria classe; no método reproduzir precisamos criar um filho da mesma classe dos pais, logo usamos [self class] como a classe do filho.</span></ul>
<h3><span style="font-family:arial,helvetica;">Últimas palavras</span></h3>
<ul><span style="font-family:arial,helvetica;">Esse tutorial deve ser aprimorado, com o passar do tempo e com sua ajuda.  Por favor, não deixe de enviar um email dizendo o que achou, se conseguiu aprender alguma coisa ou se não conseguiu aprendeu nada.Por enquanto é isso. Após essas seções estarem melhor talhadas, pretendo incluir outros tópicos, como C-básico, posing, categorias e a utilização básica do framework Foundation. Entretanto, enquanto esses aprimoramentos não vem, e caso você queira se aprofundar na linguagem eu sugiro os links e referências presentes na seção <span style="font-weight:bold;">Referências e links</span>.</p>
<p></span></ul>
<h3><span style="font-family:arial,helvetica;">Referências e links<br />
</span></h3>
<ul>
<dt><span style="font-family:arial,helvetica;"><a href="http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/ObjC.pdf">Apple Objective-C Manual</a> </span></dt>
<dt><span style="font-family:arial,helvetica;"><a href="http://theory.uwinnipeg.ca/gnu/libobjects/objective-c_toc.html">GNU Objective-C Manual</a> </span></dt>
<dt><span style="font-family:arial,helvetica;"><a href="http://users.pandora.be/stes/faq.html">comp.lang.Objective-C FAQ</a></span></dt>
<dt><span style="font-family:arial,helvetica;"><span style="font-style:italic;">Programming in Objective-C</span>, Stephen Kochan. Sams Publishing, 2004.<br />
</span></dt>
<dt><span style="font-family:arial,helvetica;"><span style="font-style:italic;">The C Programming Language</span>, Brian W. Kernighan e Dennis M. Ritche. Prentice Hall, Inc., 1988.<br />
</span></dt>
<dt><a href="http://www.gnustep.org/"><span style="font-family:arial,helvetica;">GNUstep</span></a></dt>
</ul>
<p><span style="font-family:arial,helvetica;"><span style="color:#888888;">Página por Alberto G. O. K. Martins &#8211; <a href="mailto:algol@astro.iag.usp.br">algol@astro.iag.usp.br</a><br />
Design based on the Dekorte&#8217;s Objective-C webpage. CSS additions by Alberto G. O. K. Martins.<br style="color:#888888;" /> </span><span style="color:#888888;">Qualquer contribuição, alteração, comentário ou sugestão, favor enviar para o email <a href="mailto:algol@astro.iag.usp.br">algol@astro.iag.usp.br</a>.</span></span></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webclaudio.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webclaudio.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webclaudio.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webclaudio.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webclaudio.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webclaudio.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webclaudio.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webclaudio.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webclaudio.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webclaudio.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webclaudio.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webclaudio.wordpress.com/423/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webclaudio.wordpress.com/423/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webclaudio.wordpress.com/423/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=423&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webclaudio.wordpress.com/2009/05/21/objective-c-tutorial/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5edb029e2cc8684b40fe9f5bf9deb8b7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">webclaudio</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/05/objc.png" medium="image">
			<media:title type="html">Objc</media:title>
		</media:content>
	</item>
		<item>
		<title>iPhoneOS 3.0 &#8211; Preview</title>
		<link>http://webclaudio.wordpress.com/2009/05/20/iphoneos-3-0-preview/</link>
		<comments>http://webclaudio.wordpress.com/2009/05/20/iphoneos-3-0-preview/#comments</comments>
		<pubDate>Wed, 20 May 2009 01:13:45 +0000</pubDate>
		<dc:creator>webclaudio</dc:creator>
				<category><![CDATA[IPHONE]]></category>

		<guid isPermaLink="false">http://webclaudio.wordpress.com/?p=416</guid>
		<description><![CDATA[Fala gente. Esta semana estou preso com um projeto e não está dando tempo de terminar o tuto. Espero até o fim desta semana colocar algo bom no ar. Enquanto isso, vamos nos informar com este preview do iphoneOS 3.0 que trará muitas melhorias para nós desenvolvedores. Abraços&#8230; A nova versão do sistema operacional do iPhone [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=416&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-417 alignnone" title="Logo IphoneOS 3.0" src="http://webclaudio.files.wordpress.com/2009/05/41__320x240_iphone_os_3.jpg?w=260&#038;h=203" alt="Logo IphoneOS 3.0" width="260" height="203" /></p>
<p>Fala gente. Esta semana estou preso com um projeto e não está dando tempo de terminar o tuto. Espero até o fim desta semana colocar algo bom no ar. Enquanto isso, vamos nos informar com este preview do iphoneOS 3.0 que trará muitas melhorias para nós desenvolvedores. Abraços&#8230;</p>
<p><span id="more-416"></span></p>
<p>A nova versão do sistema operacional do iPhone trará muitas novidades esperadas, como suporte a copy e paste, MMS, busca, conexão P2P, Bluetooth estéreo, uso de recursos de mapas em aplicativos e notificações via push, entre mais de 100 modificações.</p>
<p>A companhia apresentou as novidades do iPhone OS 3.0 para uma platéia em Cupertino, na Califórnia. O evento foi transmitido ao vivo por sites especializados em tecnologia, como o <a href="http://www.engadget.com/2009/03/17/live-from-apples-iphone-os-3-0-preview-event/" target="_blank">Engadget</a>.</p>
<p>Uma das novidades mais esperadas, a função de copy e paste foi confirmada. A recurso deve funcionar entre aplicações, o que significa que é possível copiar um texto do aplicativo Notes, por exemplo, e colar em um e-mail. Torpedos SMS, textos de aplicativos e até fotos também podem ser recortados, copiados e colados.</p>
<p>Os botões da caixa de cópia de texto permitem expandir ou retrair a área de seleção. Se você errar, basta chacoalhar o aparelho que a última ação será desfeita.</p>
<p>Finalmente, as mensagens multimídia (MMS) &#8211; como fotos, áudio e vídeo &#8211; serão suportadas pelo iPhone. O aplicativo de torpedos também ganha novas funções, como a possibilidade de encaminhar mensagens e deletar SMSs em grupo.</p>
<p>A usabilidade do aparelho também deve melhorar com novidades como busca e teclado em modo de paisagem para e-mails e outros aplicativos.</p>
<p><strong>Aplicações mais ricas</strong></p>
<p>Os desenvolvedores também foram beneficiados com novos recursos para seus aplicativos. A primeira função apresentada foi o pareamento de iPhones que estejam próximos via Bluetooth. O recurso de P2P não permitirá troca de arquivos, apenas interação no uso de aplicativos – como jogos, por exemplo &#8211; e poderá ser usado pelos desenvolvedores em seus programas.</p>
<p>Outra novidade é a criação de uma API pela Apple e pelo Google para que os desenvolvedores possam usar mapas em seus aplicativos. A Apple comunicou ainda que o novo sistema permitirá aos programadores o envio de notificações via push (em tempo real) para os usuários de seus softwares.</p>
<p>Por fim, na nova versão do sistema os desenvolvedores poderão vender conteúdos de dentro dos aplicativos &#8211; atualizações de jogos com novas fases ou conteúdos noticiosos, por exemplo.</p>
<p>“O objetivo é abrir caminho para uma série de inovações no aparelho”, explica Fábio Ribeiro, engenheiro de sistemas da Apple no Brasil.</p>
<p><strong>Disponibilidade</strong></p>
<p>Infelizmente, algumas das novidades &#8211; como MMS e Bluetooth estéreo &#8211; não rodarão na versão clássica do iPhone, devido a limitações de hardware.</p>
<p>A atualização do software será gratuita para os atuais usuários do iPhone e deve chegar no verão dos Estados Unidos, que vai de junho a setembro. Usuários do iPod touch terão que pagar US$ 9,95 pela nova versão do sistema.</p>
<p>Os desenvolvedores registrados no programa da Apple para vender aplicativos terão acesso imediato ao beta e ao kit de desenvolvimento (SDK) do novo sistema.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webclaudio.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webclaudio.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webclaudio.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webclaudio.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webclaudio.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webclaudio.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webclaudio.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webclaudio.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webclaudio.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webclaudio.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webclaudio.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webclaudio.wordpress.com/416/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webclaudio.wordpress.com/416/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webclaudio.wordpress.com/416/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=416&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webclaudio.wordpress.com/2009/05/20/iphoneos-3-0-preview/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5edb029e2cc8684b40fe9f5bf9deb8b7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">webclaudio</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/05/41__320x240_iphone_os_3.jpg" medium="image">
			<media:title type="html">Logo IphoneOS 3.0</media:title>
		</media:content>
	</item>
		<item>
		<title>Curso de programação para IPHONE &#8211; Parte 10</title>
		<link>http://webclaudio.wordpress.com/2009/05/11/curso-de-programacao-para-iphone-parte-10/</link>
		<comments>http://webclaudio.wordpress.com/2009/05/11/curso-de-programacao-para-iphone-parte-10/#comments</comments>
		<pubDate>Mon, 11 May 2009 05:43:03 +0000</pubDate>
		<dc:creator>webclaudio</dc:creator>
				<category><![CDATA[DESENVOLVIMENTO]]></category>
		<category><![CDATA[IPHONE]]></category>

		<guid isPermaLink="false">http://webclaudio.wordpress.com/?p=329</guid>
		<description><![CDATA[Olá pessoal. Vamos agora para a segunda parte sobre interação no iPhone. Vamos também iniciar agora com tutoriais em video para melhorar a dinâmica de aprendizagem. Vamos lá.. Bom, continuando a aula anterior vamos explicar aqui pra que serve a declaração @property. Se você trabalha com o Objective-C 2.0, você provavelmente está familiarizado com a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=329&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div style="text-align:justify;">
<p><img class="aligncenter size-full wp-image-330" title="PARTE 2 DO TÓPICO INTERAÇÃO" src="http://webclaudio.files.wordpress.com/2009/05/titinteracaop2.jpg?w=500&#038;h=150" alt="PARTE 2 DO TÓPICO INTERAÇÃO" width="500" height="150" /></p>
<p>Olá pessoal. Vamos agora para a segunda parte sobre interação no iPhone. Vamos também iniciar agora com tutoriais em video para melhorar a dinâmica de aprendizagem. Vamos lá..</p>
<p><span id="more-329"></span><br />
Bom, continuando a aula anterior vamos explicar aqui pra que serve a declaração @property.<br />
Se você trabalha com o Objective-C 2.0, você provavelmente está familiarizado com a declaração @property, mas se não está, esta linha de código pode intimidar. Não tema: Propriedades no Objective-C são realmente simples.   Deixe me pegar o rápido desvio, pois essa decoração vai ser usada constantemente nesse curso.</p>
<p><strong>Propriedades no Objective-C</strong></p>
<p>Antes da declaração @property ter sido somada no Objective-C, programadores tradicionalmente definiam pares de métodos para atribuir e recuperar valores de cada variável de uma estância de classe. Esses métodos são chamadas de acessors e mutators. (Ou se preferir, getters e setters) e podem se parecer com isso:</p>
<p><strong><em>- (id) foo<br />
{<br />
return foo:<br />
}</em></strong></p>
<p><strong><em>- (void) setFoo: (id) _foo<br />
{</em></strong></p>
<p><strong><em> if (_foo != foo)<br />
{</em></strong></p>
<p><strong><em>[_foo retain];<br />
[foo release];<br />
foo = _foo;<br />
}</em></strong></p>
<p><strong><em>}</em></strong></p>
<p>Sendo esta representação perfeitamente válida, a declaração @property permite que você diga adeus ao tedioso processo de criação de métodos acessors e mutators, se você quiser. O @property não trabalha sozinha, combinado com outra declaração no arquivo de implementação (@synthesize), que você deve ver em alguns instantes,  dirão ao compilador  para criar os métodos getter e setter em tempo de compilação.  Você deve ter que declarar uma variável de instancia como foi feito aqui, mas você não precisa definir o accessor e o mutator.</p>
<p>Em nossa declaração, o @ property chamar alguns atributos opcionais, separado por parêntese. Este ponto define como os acessors  e mutators  serão criados pelo compilador. Os dois que você verá aqui serão usados quando definirmos as propriedades na aplicação do iPhone.</p>
<p><strong><em>@property (retain, nonatomic) UILabel *statusText;</em></strong></p>
<p>O primeiro dos atributos, retain, diz ao compilador para enviar uma mensagem retain para o objeto que está assinando a propriedade. Este irá deixar a variável de instância com um  marcação para ser acessado diretamente da memória quando nós precisamos dele. Isto é necessário por causa do comportamento padrão (assign) que é concebido para ser usado com a coleção Garbage, um recurso do Objective-C que atualmente não está implementado no iPhoneOS. Como resultado, se você definir uma propriedade que é um objeto (como um inteiro), você deverá gerar um retain especifico no atributo opcional. Colocando um “<strong><em>@property (retain”</em></strong> ao declarar a propriedade para um int, float, o outro tipo de dado raw, você não precisará especificar nenhum atributo opcional.</p>
<p>O segundo dos nossos atributos opcionais, nonatomic, muda a forma que os métodos acessors e mutators são gerados. Sem ser muito técnico, apenas deixe-me dizer que, por padrão, esses métodos são criados com algum código adicional que auxilia quando estiver escrevendo programas multitarefas (que não é feito atualmente no iPhone). Este código adicional, embora pequeno, é desnecessário quando estiver declarando um ponteiro para um objeto de interface com usuário então nós declaramos nonatomic para salvar um pouco de ciclos do processador. Haverá vezes que você não vai querer especificar um nonatomic para uma propriedade. Como regra geral, você irá especificar esse atributo na maioria das vezes que estiver escrevendo aplicações iPhone.</p>
<p>Propriedades no Objetive-C tem outro recurso legal. Eles introduzem ao uso de notação de ponto para a linguagem. Tradicionalmente, para usar um método accessor, você deve enviar uma mensagem para o objeto, como esta:</p>
<p><strong><em>myVar = [algumObjeto foo];</em></strong></p>
<p>Esta abordagem irá trabalhar corretamente. Mas quando você definir uma propriedade, você também tem a opção de usar a notação de ponto, similar ao que é usado em Java, C++ e C#, desta forma:</p>
<p><strong><em>myVar = algumObjeto.foo;</em></strong></p>
<p>Essas duas representações são idênticas para compilador. Use aqui te deixar mais feliz . Notação de ponto também trabalha com mutator:</p>
<p><strong><em>algumObjeto.foo = myVar;</em></strong></p>
<p>É idêntico a:</p>
<p><strong><em>[algumObjeto setFoo: myVar];</em></strong></p>
<p><strong> </strong></p>
<p><strong>Somando Actions e Outlets para o arquivo implamatation</strong></p>
<p>Depois de termos alterado nosso cabeçalho da classe controller, salve-o e de apenas um cliente no arquivo de classe de implementação, Button_FunViewController.m</p>
<p>Neste ponto acho melhor vermos o vídeo que fiz para termos um entendimento maior, OK?</p>
<div style="text-align:center;"><strong>Parte  1</strong><br />
<object width="425" height="334"><param name="movie" value="http://www.dailymotion.com/swf/x98zvi"></param><param name="allowfullscreen" value="true"></param><param name="wmode" value="opaque"></param><embed src="http://www.dailymotion.com/swf/x98zvi" width="425" height="334" allowfullscreen="true" wmode="opaque"></embed></object></div>
<div style="text-align:center;"><strong>Parte 2</strong><br />
<object width="425" height="334"><param name="movie" value="http://www.dailymotion.com/swf/x99013"></param><param name="allowfullscreen" value="true"></param><param name="wmode" value="opaque"></param><embed src="http://www.dailymotion.com/swf/x99013" width="425" height="334" allowfullscreen="true" wmode="opaque"></embed></object></p>
<p>
</div>
<h3 style="text-align:justify;">Abaixo segue o código do arquivo button_FanViewController.m depois de alterado:<strong><br />
</strong></h3>
<div style="text-align:justify;"><em><strong>#import &#8220;button_FunViewController.h&#8221;</strong></em><em><strong>@</strong></em></p>
<p><em><strong>implementation button_FunViewController;<br />
@synthesize statusText;</strong></em></p>
<p><em><strong>- ( IBAction ) buttonPressed: (id) sender<br />
{<br />
NSString *title = [sender titleForState:UIControlStateNormal];<br />
NSString *newText = [[NSString alloc] initWithFormat: @&#8221;O botão %@ foi pressionado!&#8221;, title];<br />
statusText.text = newText;<br />
[newText release];<br />
}</strong></em></p>
<p><em><strong>- (void)didReceiveMemoryWarning {<br />
[super didReceiveMemoryWarning]; // Releases the view if it doesn&#8217;t have a superview<br />
// Release anything that&#8217;s not essential, such as cached data<br />
}</strong></em></p>
<p><em><strong>- (void)dealloc {<br />
[statusText release];<br />
[super dealloc];<br />
}<br />
@end</strong></em></p>
<p>Espero que tenham gostado. No próximo capítulo vamos fazer uma aplicação mais complexa. Explicarei também cada componente da Biblioteca gráfica do IB. Até lá&#8230;</p></div>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webclaudio.wordpress.com/329/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webclaudio.wordpress.com/329/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webclaudio.wordpress.com/329/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webclaudio.wordpress.com/329/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webclaudio.wordpress.com/329/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webclaudio.wordpress.com/329/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webclaudio.wordpress.com/329/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webclaudio.wordpress.com/329/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webclaudio.wordpress.com/329/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webclaudio.wordpress.com/329/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webclaudio.wordpress.com/329/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webclaudio.wordpress.com/329/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webclaudio.wordpress.com/329/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webclaudio.wordpress.com/329/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=329&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webclaudio.wordpress.com/2009/05/11/curso-de-programacao-para-iphone-parte-10/feed/</wfw:commentRss>
		<slash:comments>34</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5edb029e2cc8684b40fe9f5bf9deb8b7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">webclaudio</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/05/titinteracaop2.jpg" medium="image">
			<media:title type="html">PARTE 2 DO TÓPICO INTERAÇÃO</media:title>
		</media:content>
	</item>
		<item>
		<title>Curso de programação para IPHONE &#8211; Parte 9</title>
		<link>http://webclaudio.wordpress.com/2009/05/04/curso-de-programacao-para-iphone-parte-9/</link>
		<comments>http://webclaudio.wordpress.com/2009/05/04/curso-de-programacao-para-iphone-parte-9/#comments</comments>
		<pubDate>Mon, 04 May 2009 04:36:34 +0000</pubDate>
		<dc:creator>webclaudio</dc:creator>
				<category><![CDATA[DESENVOLVIMENTO]]></category>
		<category><![CDATA[IPHONE]]></category>

		<guid isPermaLink="false">http://webclaudio.wordpress.com/?p=299</guid>
		<description><![CDATA[Olá pessoal. Neste capítulo vamos aprender sobre como interagir um pouco mais com o usuário. E para isso vamos construir nossa primeira aplicação usando o Interface Builder que vamos a partir de agora chamar carinhosamente de IB. Mas antes acho prudente falar também de algumas limitações quando se programa para dispositivos móveis. Bom aprendizado. Bom, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=299&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-300" title="Título do Post" src="http://webclaudio.files.wordpress.com/2009/05/titinteracao.jpg?w=500&#038;h=150" alt="Título do Post" width="500" height="150" /></p>
<p>Olá pessoal. Neste capítulo vamos aprender sobre como interagir um pouco mais com o usuário. E para isso vamos construir nossa primeira aplicação usando o Interface Builder que vamos a partir de agora chamar carinhosamente de IB. Mas antes acho prudente falar também de algumas limitações quando se programa para dispositivos móveis. Bom aprendizado.</p>
<p><span id="more-299"></span></p>
<p>Bom, vamos começar a descrever as limitações no que diz respeito a desenvolver para iPhone:</p>
<div style="text-align:justify;">
<p><strong>Limitações da Plataforma </strong></p>
<p>Quando se fala de plataformas móveis como o iPhone, sempre surgem várias preocupações, tais como armazenamento, limites de interação, bem como a duração da bateria. Plataformas móveis não podem oferecer o mesmo espaço em disco que dispositivos Desktops.  E juntamente com limites de armazenamento, interfaces reduzidas e o consumo de energia restringem de uma forma muito real o que você como um desenvolvedor pode realizar.</p>
<p>Com o iPhone, não é possível desenvolver pensando em uma grande tela, um mouse, um teclado físico, ou mesmo para um abastecimento de energia sempre ligado na parede. Em vez disso, você deve moldar e orientar o seu desenvolvimento às realidades da plataforma. Felizmente, a Apple fez um trabalho incrível criou uma nova plataforma que impulsiona alguma flexibilidade a partir do seu conjunto de armazenamento limitado, interação limitada e limitada vida da bateria.</p>
<p><strong>Limites de Armazenamento </strong></p>
<p>O iPhone possui uma poderosa mas ainda compacta versão do sistema operacional OS X instalado. Embora todo o iPhoneOS preencha não mais do que algumas centenas de megabytes de espaço, quase nada comparado aos sistemas operacionais de hoje,  ainda fornece uma biblioteca extensa de frameworks.</p>
<p>Estes frameworks de rotinas pré-compiladas do iPhone permitem aos usuários executar uma gama diversificada de compactas aplicações, desde telefonia à reprodução de áudio, desde e-mail à navegação na Web.</p>
<p>O iPhone oferece suporte suficiente de programação para criar interfaces flexíveis mantendo-se seus arquivos de sistema em tamanhos reduzidos para encaixar perfeitamente dentro de limites de armazenagem apertados..</p>
<p><strong>Limites de Acesso a Dados</strong></p>
<p>Cada aplicação do iPhone sofre um “sandbox” (Nome conhecido em ambientes Unix cuja tradução é caixa de areia, este procedimento fecha sua aplicação e limita acessos ao dispositivo e Sistema operacional) . Seu programa não pode ser acessado a partir de outras aplicações e de certas pastas, incluindo a biblioteca iTunes interna. Ele pode, porém, acessar quaisquer dados que estejam disponíveis gratuitamente através da Internet quando o iPhone está conectado a uma rede.</p>
<p><strong>Limites de Memória </strong></p>
<p>Em se falando de iPhone, o gerenciamento de memória é critico.O iPhone não dá suporte ao “swap” para realizar memória virtual (Acredito que todos saibam do que estou falando).Quando sua memória se esgota, o iPhone reinicializa. Provavelmente randômicos reboots não são a melhor experiência com usuário que você estava esperando. Sem “Swap”, você deve gerenciar cuidadosamente a sua memória e exige-se estar preparado para o caso do iPhoneOS terminar a sua aplicação se este consumir muita memória.Você também deve ter cuidado no que diz respeito ao uso de recursos. Muitas aplicações usam alta resolução de imagens e arquivos de áudio pesados que podem fazer seu programa candidato para um autoterminate.</p>
<p style="padding-left:30px;"><em>Nota<br />
Xcode automaticamente otimiza suas imagens PNG utilizando o utilitário pngcrush do SDK.  Por esta razão, você deve utilizar imagens PNG em suas aplicações iPhone sempre que possível como o seu formato preferido de imagem.</em></p>
<p><em> </em></p>
<p><strong>Limites de Interação </strong></p>
<p>Trocar dispositivos físicos de entrada e trabalhar em uma pequena tela não significa que você perde interação e flexibilidade. Com o multitouch (Múltiplos toques), você pode construir interfaces de usuário que desafiam as regras. A tecnologia touch do iPhone permite que você crie aplicações completas com entradas de texto e pontuação, usando uma teclado virtual que é muito maior do que seria um real físico. Um auto-corretor inteligente e um acelerômetro que detecta a posição do aparelho são apenas duas das principais tecnologias que separam o iPhone do resto da computação móvel.</p>
<p style="padding-left:30px;"><em>Nota<br />
A tela do iPhone suporta até cinco toques ao mesmo tempo, embora, seja raro encontrar qualquer aplicação que use mais de dois de uma vez.</em></p>
<p><strong>Limites de Energia </strong></p>
<p>Para plataformas móveis, você não pode ignorar as limitações de energia. Sabendo disto, as  características do SDK da Apple ajudam a criar as suas aplicações limitando a utilização da CPU e evitando o uso contínuo da bateria. A utilização inteligente da tecnologia (por exemplo, como suspender corretamente os programas) permite que seus aplicativos rodem muito bem no iPhone e evitam do seu software queimar energia à toa. Alguns programas, quando deixados executando, produzem elevados níveis de calor residual fazendo com que o telefone torna-se quente ao toque e a bateria rapidamente acabe. A câmera é um notável exemplo.</p>
<p><strong>Limites de Aplicação</strong></p>
<p>A Apple tem instituído uma forte política de &#8220;uma aplicação por vez&#8221;. O que significa que para um programador não é possível desenvolver aplicações que são executados em segundo plano como os da Apple (utilitários de Correio e telefone). Cada vez que seu programa é executado, tem de limpar e metaforicamente sair do controle antes de passar para a próxima aplicação selecionada pelo usuário. E não podem deixar correr um daemon que verifica a existência de novas mensagens e as envia ou periodicamente fazer updates. Um &#8220;Open SDK&#8221; criado por hackers existe para contornar esta limitação, mas aplicações construídas com essas ferramentas não podem ser adicionados aos e vendidos através do iPhone AppStore.</p>
<p>Por outro lado, a Apple suporta enviar dados pela Web. WebServices podem enviar e receber  mensagens as aplicações.</p>
<p style="padding-left:30px;"><em>Nota<br />
De acordo com os Termos de Serviço do iPhone, você não pode criar frameworks externos para a sua aplicação iPhone ou usar a arquitetura de plug-in Cocoa nas aplicações apresentados à AppStore.</em></p>
<p>Bom, então conhecendo nossas limitações vamos por a mão na massa e fazer nossa primeira aplicação usando o interface Builder (IB para os íntimos).</p>
<p><strong>Manipulando Interações</strong></p>
<p>Nossa aplicação “Alô Mundo!” foi uma boa introdução para o desenvolvimento em iPhone usando o Cocoa Touch, mas ele não tem uma crucial habilidade: A habilidade de interagir com o usuário. Sem ele, nossa aplicação é severamente limitada em termos de abrangência.</p>
<p>Neste capítulo nós iremos escrever uma aplicação um pouco mais complexa, com dois botões e um label como mostrado na figura abaixo. Quando o usuário tocar no botão a mensagem do label mudará. Isto pode ser visto como um exemplo simples, mas irá demonstrar o conceito básico para manipular controles nas aplicações iPhone.</p></div>
<div style="text-align:justify;"><img class="aligncenter size-full wp-image-312" title="projeto2-1" src="http://webclaudio.files.wordpress.com/2009/05/projeto2-1.jpg?w=227&#038;h=435" alt="projeto2-1" width="227" height="435" /><strong>O paradigma MVC</strong></p>
<p><strong> </strong></p>
<p>Antes de iniciarmos, precisamos de um pouco de teoria. Os designers do Cocoa Touch foram guiados por um conceito chamado Model-View-Controller (ou MVC), que é o caminho mais lógico de dividir o código da interface gráfica. Nos dias atuais todos os frameworks pegam um pouco da lógica MVC, mas nenhum outro como o Cocoa Touch.</p>
<p>O modelo MVC divide todas as funcionalidades em três categorias distintas:</p>
<ul>
<li>Model: São as classes de sua aplicação que acessam dados;</li>
<li>View: Contém seus Windows, controls, e outros elementos que o usuário possa interagir;</li>
<li>controller: liga o Model ao view e é a parte lógica da aplicação que decide como manipular as entradas do usuário.</li>
</ul>
<p>A meta no MVC é fazer que os objetos que implementam esses três tipos de código serem diferentes um do outro quanto possível. Qualquer objeto que você escreva o terá que ser identificado em uma dessas três categorias, com pequena ou nenhuma funcionalidade e que o fizesse estar classificada nas outras duas.</p>
<p>Em um objeto que implementamos um botão, por exemplo, não se deve conter códigos para processar dados quando este botão é pressionado, e o código que implementa uma conta de banco não deve desenhar a tabela que mostra esta transação.</p>
<p>O MVC ajuda a você a ter o máximo de reusabilidade. A classe que implementa um botão genérico pode ser usada em qualquer aplicação. A classe que implementar um botão que faz um cálculo particular só podem ser usados na aplicação que originalmente foi escrito.</p>
<p>Quando você escreve aplicações Cocoa Touch, você irá primeiramente criar seus componentes View usando o interface builder, você poderá também algumas vezes modificar sua interface pelo código, ou você poderá instânciar existentes views e controls.</p>
<p>O seu Model será criado pelas classes do Objective-C que você criar e que são específicas para a sua aplicação. Mas não estaremos criando nenhum objeto Model neste capítulo, porque nós não precisamos guardar ou preservar dados, mas nós iremos introduzir objetos Model quando nossa aplicação ficar mais complexa em futuros capítulos.</p>
<p>Seu componente controller estará tipicamente compreendida nas classes que você criar e que são específicas para a sua aplicação. Controllers podem ser completamente customizadas, mas eles oferecem mais, eles podem ser istanciadas dia existentes classes de controles genéricos do UIKit framework como o UIViewController, que você verá em alguns instantes. Istanciando uma dessas existentes classes, você irá pegar um monte de funcionalidades gratuitamente a que não terá de perder tempo reinventando a roda, como dizem.</p>
<p>Quando nós nos aprofundarmos no Cocoa Touch, você irá rapidamente começar a ver como as classes do framework UIKit segue os princípios da MVC. Se você colocar este conceito dentro de sua cabeça de desenvolvedor, você irá melhorar seu código e verá que ficará mais fácil mantê-lo.</p>
<p><strong> </strong></p>
<p><strong>Criando nosso projeto</strong></p>
<p><strong> </strong></p>
<p>Desta vez para criar o nosso projeto Xcode. Nós iremos usar um diferente template: view-based Application. Vamos em frente criar o nosso projeto, salve-o com o nome de Button_Fun. Se você tiver algum problema criando seu projeto, referencie o procedimento do capítulo anterior.</p>
<p>Você provavelmente se lembrar que o projeto foi criado com algumas classes para nós. Você irá encontrar as mesmas classes neste projeto apenas os nomes que serão um pouco diferente por causa dos nomes das classes serem baseadas no nome do projeto.</p>
<p><strong>Criando o View controller</strong></p>
<p>Um pouco depois deste capítulo, nós iremos desenhar um View (ou interface de usuário) para nossa aplicação usando o interface Builder, como nós dissemos no último capítulo. Antes de nós fazemos isso, nós iremos dar uma olhada e fazer algumas mudanças no código que foi criado automaticamente para nós.</p></div>
<div style="text-align:justify;">Antes de nós fazemos algumas mudanças, vamos dar uma olhada nos arquivos que foram criados para nós. Na janela de projeto, expanda a pasta de classes para revelar os quatro arquivos dentro. Conforme imagem abaixo:</div>
<div style="text-align:justify;"><img class="aligncenter size-full wp-image-313" title="projeto2-2" src="http://webclaudio.files.wordpress.com/2009/05/projeto2-2.jpg?w=446&#038;h=295" alt="projeto2-2" width="446" height="295" />Estes quatro arquivos implementam 2 classes, cada uma contém um .m e .h arquivo. Aplicação que nós iremos criar neste capítulo tem somente um View, e a classe controller  que é responsável pelo gerenciamento  é chamada Button_FunxiewController Clique no Button_FunViewController.h e dê uma  olhada no conteúdo arquivo:</p>
<p>#import &lt;UIKit/UIKit.h&gt;<br />
@interface Button_FunxiewController: UIViewController {</p>
<p>}<br />
@end</p>
<p>Não é muito. Essa é uma estância do UIViewController, que é uma das classes de controles genéricos que nós mencionamos anteriormente a. Ele faz parte do UIKit e nos dá um range de funcionalidades gratuitamente. Os Xcode não sabe que funcionalidade específica nossa aplicação do irá fazer, ele só sabe que irá fazer alguma coisa, então ele cria esta classe para essa funcionalidade genérica.</p>
<p>Nosso programa consiste em dois botões e uma caixa de texto que reflete qual botão nós apertamos. Mas criaremos todos esses três elementos no interface Builder. Desde que nós também iremos escrever um código, ele deve ter alguma forma de interagir com seu código a interagir com os elementos criados no interface Builder, certo?</p>
<p>Absolutamente certo. Nossa classe controller pode referenciar objetos do interface Builder usando uma especial porção de variáveis de instâncias chamadas de “Outlet”. Pense no Outlet como um ponteiro que aponta para um objeto do nib. Por exemplo, suponha que você crie uma caixa de texto no interface Builder e queira chamar essa caixa de texto pelo seu código.  Para declarar um outlet para o objeto label, você deve usar o outlet dentro do seu código para mudar o objeto label. Você verá como fazer isso daqui a pouco.</p>
<p>Indo em outra direção, objetos de interface no nosso arquivo “nib” pode ser configurado para chamar métodos especiais na nossa classe controller. Só que esses métodos especiais são conhecidos como os métodos de ação “Action”. Por exemplo, você pode dizer o interface Builder que quando o usuário tocar no botão, um método especifico do código deve ser chamado.</p>
<p>Nosso próximo exemplo irá atribuir dois botões e um label.</p>
<p>No nosso código, iremos criar um outlet que aponta para o label, e este outlet irá permitir mudar o texto do label. Nós também criaremos um método chamado buttonPressed: que irá acionar quando um dos dois botões forem tocados . buttonPressed: irá configurar a propriedade texto do label dizendo ao usuário que botão ele apertou.</p>
<p>Nós usaremos o interface Builder  para criar os botões e eu label, e depois nós faremos alguns cliques e arrastar e soltar para conectar o label ao nosso label Outlet e nossos botões a nossa ação buttonPressed.</p>
<p>Mas antes vamos mexer no código, mas daremos um pouco mais de detalhes sobre os Outlets e os Actions.</p>
<p><strong>Outlets</strong></p>
<p>Outlet são variáveis de instância e são declaradas usando a palavra chave IBOutlet. A declaração de um Outlet fica no cabeçalho do seu  arquivo controller “.h” que pode se parecer com isso:</p>
<p><strong><em>IBOutlet      UIButton     *myButton;</em></strong></p>
<p>A palavra chave IBOutlet  é definida desta forma:</p>
<p><strong><em>#ifndef IBOutlet<br />
#define IBOutlet<br />
#endif</em></strong></p>
<p>Confuso? IBOutlet Não faz absolutamente nada em que o compilador esteja envolvido. Ele é feito propositalmente o para agir como uma dica ao interface Builder que esta é uma variável de instância que nós iremos conectar a um objeto em um nib. Qualquer variável de instância que você crie e quiser conectar a um objeto no arquivo nib deve ser precedida de um  IBOutlet. Quando você abrir o interface Builder, ele irá procurar os seus arquivos de cabeçalho do projeto a ocorrência dessa palavra chave em irá permitir a você fazer conexões do seu código para a sua variável nib equivalente. Em alguns minutos, você verá como atualmente se faz uma conexão em entre o Outlet e  um objeto de interface de usuário com interface Builder.</p>
<p><strong>Actions</strong></p>
<p>Actions São métodos que fazem parte de sua classe controller. Eles são também declarados com uma palavra chave especial ,  IBAction, que xiz ao interface Builder que este método é uma  ação e pode ser provocado por um controle. Tipicamente, é o a declaração de um método Action  irá se parecer com isso:</p>
<p><strong><em>- (IBAction) fazAlgumaCoisa:(id)sender;</em></strong></p>
<p>O atual nome do método pode ser qualquer coisa que você quiser, mas ele deve retornar um tipo  “IBAction”, que é o mesmo que declarar um tipo de retorno “void”.  Esta é outra forma de dizer que o método Action não retorna valor algum.  Usualmente, o método Action  irá pegar  um argumento,  e será tipicamente definido como id e também dará o nome de quem solicitou (sender). O controle que provoca a sua ação usar o argumento “sender” para passar a referência dele mesmo. Então, por exemplo, se seu  método Action foi chamado pelo resultado de um toque no botão, o argumento “sender” deverá conter a referência para o botão específico que foi apertado.</p>
<p>Como você verá, o nosso programa irá usar o argumento sender para configurar o label com texto esquerda e direita, dependendo do botão que você apertar. Se você não precisa saber qual o controle chamou seu método, você pode também definir o método Action sem um parâmetro “sender”. Ele deve se parecer com isto:</p>
<p><strong><em>- (IBAction) fazAlgumaCoisa;</em></strong></p>
<p>Você não precisa se preocupar se você declarar um método Action com um argumento “sender” e ignorar o “sender”. Os métodos Action do Cocoa aceitam o sender sendo usados ou não.</p>
<p><strong>Somando  Actions e Outlets  no seu View controller </strong></p>
<p>Agora que você sabe o que Outlets e    Actions  são, vamos ao cabeçalho somar cada uma de nossas classes de controle. Nós precisaremos de um Outlet para podermos mudar o label. Nós não vamos querer mudar nada nos botões, nós não precisaremos de Outlet para eles.</p>
<p>Nós iremos declarar um único método Action que será chamado por ambos os botões. Quando muito os métodos Action são chamados por um único controle, é possível usar a mão única ação para manipular entradas de múltiplos controles, que é o que nós vamos fazer aqui. Nosso Action irá pegar o nome do Butão e colocar no argumento sender e usar o Outlet do label para inserir no nome do botão na propriedade ”text” do label.</p>
<p>Vamos agora somar o seguinte código no Button_FunViewController.h:</p>
<p><strong>Nota: O que tiver em negrito é o que está sendo somado.</strong></p>
<p><em>#import &lt;UIKit/UIKit.h&gt;<br />
@interface Button_FunxiewController: UIViewController {</em></p>
<p><strong><em>IBOutlet   UILabel  *statusText;</em></strong><em><br />
}<br />
<strong>@property (retain, nonatomic) UILabel   *statusText;</strong></em></p>
<p><strong><em>- (IBAction) buttonPressed: (id)sender;</em></strong><em><br />
@end</em></p>
<p><em>Bom gente, acho que já tem muito texto para um Capítulo só.  Desculpem tanta teoria, mas sem ela não irá ter pernas para caminhar por outras veredas. Nesta semana ainda termino a outra parte do nosso projeto. Consegui uma forma mais rápida de fazer estes tutoriais e pretendo adiantá-los bastante. Abraços.<br />
</em></div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webclaudio.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webclaudio.wordpress.com/299/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webclaudio.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webclaudio.wordpress.com/299/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webclaudio.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webclaudio.wordpress.com/299/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webclaudio.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webclaudio.wordpress.com/299/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webclaudio.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webclaudio.wordpress.com/299/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webclaudio.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webclaudio.wordpress.com/299/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webclaudio.wordpress.com/299/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webclaudio.wordpress.com/299/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=299&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webclaudio.wordpress.com/2009/05/04/curso-de-programacao-para-iphone-parte-9/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5edb029e2cc8684b40fe9f5bf9deb8b7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">webclaudio</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/05/titinteracao.jpg" medium="image">
			<media:title type="html">Título do Post</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/05/projeto2-1.jpg" medium="image">
			<media:title type="html">projeto2-1</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/05/projeto2-2.jpg" medium="image">
			<media:title type="html">projeto2-2</media:title>
		</media:content>
	</item>
		<item>
		<title>Curso de programação para IPHONE &#8211; Parte 8</title>
		<link>http://webclaudio.wordpress.com/2009/04/25/curso-de-programacao-para-iphone-parte-8/</link>
		<comments>http://webclaudio.wordpress.com/2009/04/25/curso-de-programacao-para-iphone-parte-8/#comments</comments>
		<pubDate>Sat, 25 Apr 2009 05:44:22 +0000</pubDate>
		<dc:creator>webclaudio</dc:creator>
				<category><![CDATA[DESENVOLVIMENTO]]></category>
		<category><![CDATA[IPHONE]]></category>

		<guid isPermaLink="false">http://webclaudio.wordpress.com/?p=273</guid>
		<description><![CDATA[Olá galera. Apesar de estar muito ocupado na empresa, estou de volta com algum aprendizado sobre o XCODE. Daremos uma vistoriada geral nesta fantástica aplicação que tem tudo que precisamos para fazermos aplicações para o iPhone. Boa aula. Introdução ao XCODE Programar para Apple começa com o XCODE, é um ambiente integrado de desenvolvimento ( mais conhecido [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=273&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-274" title="titxcode" src="http://webclaudio.files.wordpress.com/2009/04/titxcode.jpg?w=500&#038;h=150" alt="titxcode" width="500" height="150" /></p>
<p style="text-align:justify;">Olá galera. Apesar de estar muito ocupado na empresa, estou de volta com algum aprendizado sobre o XCODE. Daremos uma vistoriada geral nesta fantástica aplicação que tem tudo que precisamos para fazermos aplicações para o iPhone. Boa aula.</p>
<p><span id="more-273"></span></p>
<p style="text-align:justify;"><strong>Introdução ao XCODE</strong></p>
<p style="text-align:justify;">Programar para Apple começa com o XCODE, é um ambiente integrado de desenvolvimento ( mais conhecido por IDE), que pode ser chamado a partir do diretório do desenvolvedor.</p>
<p style="text-align:justify;">Para escrever programas para iPhone, você deve ter baixado o iPhone SDK, como discutido nos capítulos anteriores. Depois de feito isso, escolha Arquivo&gt; Novo projeto irá abrir um wizard para ajudar a criar seu projeto.</p>
<p style="text-align:justify;"><img class="aligncenter size-full wp-image-294" title="flex_xcode_template" src="http://webclaudio.files.wordpress.com/2009/04/flex_xcode_template.jpg?w=500&#038;h=373" alt="flex_xcode_template" width="500" height="373" /></p>
<p style="text-align:justify;">Você vai ser imediatamente solicitado a selecionar um modelo para o seu novo projeto. O modelo que você escolher vai preencher o seu projeto com o framework padrão, arquivos padrões, objetos padrões, e sempre o mesmo código padrão. Como você vai ver, vai ser uma grande ajuda para iniciar o seu próprio código. Para o seu primeiro programa, quero começar com o mais simples modelo que podemos encontrar: Window-Based Application.<br />
Depois de selecionar um modelo, você precisará também do nome do seu projeto e escolher onde salvá-lo, depois que você tiver feito isso, você está pronto para iniciar a codificação. Antes de chegarmos lá, porém, vamos dar uma olhada mais de perto na forma de trabalho do ambiente XCODE.</p>
<p style="text-align:justify;"><strong>A Anatomia do XCODE</strong></p>
<p style="text-align:justify;">Quando acionado, o XCODE exibe apenas uma janela.  Onde aparece o nosso primeiro projeto, helloworld.</p>
<p style="text-align:justify;">Como você pode ver, a janela principal do Xcode compreende três partes.</p>
<p style="text-align:justify;">Na esquerda tem uma barra lateral que contém uma listagem de todos os arquivos que estão sendo usados no seu projeto, organizados por tipo. Sempre que você precisar adicionar frameworks, imagens, bases de dados, ou outros arquivos para seus projetos, você vai fazê-lo aqui. O painel esquerdo contém também alguns outros elementos úteis, em especial um item de <span style="text-decoration:underline;">Errors and Warnings</span> (Erros e avisos) que você pode clicar em abrir para ver rapidamente os problemas na sua compilação.</p>
<p style="text-align:justify;">O topo-direito contém um painel com uma lista de arquivos desagrupados usado pelo seu projeto. Quando você clica em um desses, o seu conteúdo será exibido no painel inferior direito. Como você pode ver, mesmo o mais simples programa irá incluir mais de uma meia-dúzia de arquivos.</p>
<p style="text-align:justify;">O que é cada um deles.</p>
<p style="text-align:justify;"><img class="aligncenter size-full wp-image-284" title="tabela-1" src="http://webclaudio.files.wordpress.com/2009/04/tabela-1.jpg?w=500&#038;h=377" alt="tabela-1" width="500" height="377" /></p>
<p style="text-align:justify;">Neste capítulo iremos focar exclusivamente nos cabeçalhos e arquivos de código fonte. No próximo capítulo iremos expandir o nosso trabalho para incluir também o arquivo do Interface Builder &#8220;.xib&#8221;.</p>
<p style="text-align:justify;"><strong>Compilando e Executando no XCODE</strong></p>
<p style="text-align:justify;">Para compilar no Xcode, escolha Build &gt; Build and Run a partir dos menus. Seu programa irá compilar e fazer o link. Em seguida, ele será instalado no iPhone Simulator, e do iPhone Simulator irá iniciar. Se você tentar isso, utilizando o projeto que acaba de criar usando o modelo Window-Based Application, você verá todo o processo, resultando em uma janela vazia branca sobre tela exibindo dentro do seu iPhone Simulator. Note que os programas só existem no seu Simulator (ou no iPhone), que não pode ser executado diretamente em seu Macintosh. Se quiser mais tarde re-executar um programa que você já tenha compilado, você pode fazê-lo em uma das três maneiras. Você pode simplesmente clicar no botão do programa, que deve agora aparecer no seu Simulator. Ou, você pode escolher Run &gt; Run a partir de dentro Xcode. Finalmente, você pode escolher Build and Go no Xcode, que só compila se for necessário, em seguida, executa seu programa. E é isso. Com uma compreensão rudimentar do Xcode agora em mãos, você está pronto desenvolver seu primeiro programa.</p>
<p style="text-align:justify;"><strong>Criando um primeiro projeto no XCODE: Olá, Mundo!</strong></p>
<p style="text-align:justify;">Como já observado, você deve iniciar qualquer projeto, executando File &gt; New Project, escolher um modelo, e nomear o seu projeto. Para a nossa primeira amostra de projeto, foram selecionados o modelo Window-Based Application, e o nome alomundo. Antes de você começar a escrever o novo código, você precisa de uma compreensão básica do que já está lá, por isso vamos analisar o conteúdo dos três mais importantes arquivos que o nosso modelo Window-Based, que são: main.m, alomundoAppDelegate.h, e o alomundoAppDelegate.m.</p>
<p style="text-align:justify;"><strong>Entendendo o  main.m</strong></p>
<p style="text-align:justify;">O primeiro arquivo criado pelo XCODE é main.m, que contém a sua função principal:</p>
<address><strong><em>int UIApplicationMain (</em></strong></address>
<address><strong><em>int argc,<br />
char *argv[],<br />
NSString *principalClassName,<br />
NSString *delegateClassName<br />
);</em></strong></address>
<p style="text-align:justify;">
<p style="text-align:justify;">A criação desta rotina principal é automática, e você geralmente não deve perder  tempo com ele. No entanto, vale a pena entender como ele funciona. Ele Começa com uma diretiva <strong><em>#import</em></strong>, que é o equivalente do Objective-C ao #include do C#. Mais especificamente, você incluiu o UIKit framework, que é o mais importante framework no Objective-C.</p>
<p style="text-align:justify;">O próximo a ser criado é o NSAutoreleasePool. Você deve se lembrar dele, pois foi mencionado em nossa discussão de gestão de memória no capítulo anterior. É o que dá suporte ao método autorelease da classe NSObject. Observe também que você libera o pool  depois que você executar o seu pedido principal da rotina, seguindo a regra de que, se você atribuir a memória para um objeto, você também deve liberá-lo.</p>
<p style="text-align:justify;">A linha com o UIApplicationMain é o que cria a sua aplicação e executa o seu ciclo de evento. Os argumentos da função se parecem com isto:</p>
<address><strong><em>int UIApplicationMain (</em><em>int argc,</em></strong></address>
<address><strong><em>char *argv[],<br />
NSString *principalClassName,<br />
NSString *delegateClassName<br />
);</em></strong></address>
<p style="text-align:justify;">
<p style="text-align:justify;">Tal como acontece com o resto do arquivo main.m, você nunca deve ter de alterar esta código, mas devemos, no entanto, falar brevemente sobre os dois últimos argumentos embora eles geralmente serem definidos por padrão como nil (nulos) .</p>
<p style="text-align:justify;">O principalClassName define a classe principal  da aplicação, por padrão é o UIApplication. Esta categoria tem uma série de ações e controle de eventos para o seu programa, tema que vamos voltar a falar em outros capítulos. O objeto UIApplication é criado como parte desta rotina inicial, mas note que nenhuma link com o objeto é provido. Se precisar acessá-lo (e você irá), você pode utilizar um método da classe UIApplication para fazê-lo:</p>
<address><strong><em>[UIApplication sharedApplication];</em></strong></address>
<p style="text-align:justify;">
<p style="text-align:justify;">Isso retornará o objeto da aplicação. Isto será normalmente enviado como parte de uma mensagem aninhada UIApplication para um método, como você verá em futuros capítulos.</p>
<p style="text-align:justify;">Por enquanto, a aplicação faz duas coisas a se notar: ela chama o arquivo .xib padrão e ele interage com seu Application Delegate. O delegateClassName define a aplicação do objeto delegado. Como já se observou ali, este é o objeto que responde a algumas mensagens da aplicação, tal como foi definido pelo protocolo da classe UIApplicationDelegate. Entre outras coisas, a aplicação deve responder e delegar o ciclo de vida das mensagens, mais especificamente o applicationDidFinishLaunching: que controla o seu programa em termos de conteúdo, como iremos falar mais tarde. Nos moldes do Xcode, seus arquivos de classes delegates sempre terão o nome do projeto + appdelegate. Seu programa irá encontrá-los, graças a propriedade delegate que é construído no Interface Builder. Você pode mudar os argumentos enviados para UIApplicationMain e você pode adicionar ao arquivo main.m outros comandos, mas geralmente não vai querer. O padrão deve funcionar bem para todos os programas. Então, vamos sair do main.m e nos voltar para o arquivo onde qualquer programação realmente começa:  O application delegate.</p>
<p style="text-align:justify;"><strong>Entendendo o application delegate</strong></p>
<p style="text-align:justify;">Como você já viu, o <strong>application delegate</strong> é responsável por responder a muitas das mensagens das aplicações. Você pode referenciar ao capítulo anterior, para uma lista de algumas das mais importantes ou ir guia de referência da Apple e fuçar UIApplicationDelegate para uma listagem completa. Mais especificamente, um <strong>application delegate</strong> deve fazer o seguinte:</p>
<ul class="unIndentedList" style="text-align:justify;">
<li>No momento do lançamento, é preciso criar um objeto Window e exibi-lo para o usuário.</li>
<li>É preciso inicializar seus dados.</li>
<li>É preciso responder ao pedido de &#8220;quit&#8221;.</li>
<li>É preciso lidar com advertências de baixa memória.</li>
</ul>
<p style="text-align:justify;">Entre estes itens, é o primeiro que é de extrema importância para você agora. Seus arquivos de <strong>application delegate</strong>, alomundoAppDelegate.h e alomundoAppDelegate.m, sabem desta forma que o seu programa começou ..</p>
<p style="text-align:justify;"><strong>O Arquivo Header</strong></p>
<p style="text-align:justify;">Agora, você está realmente usando classes, que é o tipo de codificação que compõe a grande maioria dos códigos Objective-C. vamos mostrar o conteúdo de seu primeiro arquivo de cabeçalho de classe, alomundoAppDelegate.h.</p>
<address><em><strong>@interface helloworldxcAppDelegate : NSObject &lt;UIApplicationDelegate&gt; {    <span style="color:#ff0000;">(1)</span><br />
UIWindow *window;    <span style="color:#ff0000;">(2)</span><br />
}<br />
@property (nonatomic, retain) IBOutlet UIWindow *window;     <span style="color:#ff0000;">(3)</span></strong></em></address>
<p style="text-align:justify;">
<p style="text-align:justify;">Novamente, não há nada para mudar daqui, mas queremos analisar o conteúdo, tanto para reiterar algumas das lições que aprendemos no capítulo anterior como para lhe dar uma boa base para um trabalho que vai fazer no futuro.  Primeiro, você verá uma linha interface <span style="color:#ff0000;"><strong>(1)</strong></span> que herda suas delegações do NSObject e inclui uma promessa de seguir o protocolo UIApplicationDelegate.  Em seguida, você tem a declaração de uma variável de instância do objeto <strong>UIWindow <span style="color:#ff0000;">(2)</span></strong>.  Finalmente, você declara essa variável window como uma propriedade <span style="color:#ff0000;"><strong>(3)</strong></span>. Você notará que esta declaração,  inclui alguns dos atributos que nós já mencionamos anteriormente, que são nonatomic,  retain. Esta linha inclui também uma declaração IBOutlet, que diz que o objeto  foi realmente criado no Interface Builder. Iremos examinar este conceito de forma mais aprofundada no próximo capítulo, mas, por enquanto, você só precisa saber que você tem um objeto <strong>window</strong> já preparado para seu uso.  Embora você não possa modificar este arquivo header neste exemplo, você vai no futuro,  e você geralmente irá repetir os padrões que você vê aqui: criando mais  variáveis de instancia, incluindo IBOutlets, e definirá mais propriedades. Você também pode declarar cabeçalho de métodos neste arquivo, algo que este exemplo de cabeçalho não contém.</p>
<p style="text-align:justify;"><strong>O Arquivo source code (Código fonte)</strong></p>
<p style="text-align:justify;">Vamos agora para o arquivo onde exibe código-fonte do <strong>application delegate</strong>, que é o alomundoAppDelegate.m, e é aqui que você vai  colocar o seu novo código.</p>
<address><em><strong>#import &#8220;alomundoAppDelegate.h&#8221;                                                            <span style="color:#ff0000;">(1)</span></strong><strong><br />
@implementation alomundoAppDelegate                                                  <span style="color:#ff0000;">(2)</span></strong><strong><br />
@synthesize window;                                                                                   <span style="color:#ff0000;">(3)</span><br />
</strong><strong>- (void)applicationDidFinishLaunching:(UIApplication *)application {     <span style="color:#ff0000;">(4)</span><br />
[window makeKeyAndVisible];                                                                  <span style="color:#ff0000;">(5)</span><br />
}<br />
- (void)dealloc {<br />
[window release];<br />
[super dealloc];</strong><strong><br />
}<br />
@end</strong></em></address>
<p style="text-align:justify;">
<p style="text-align:justify;">O Código começa com a inclusão do arquivo de cabeçalho da classe <span style="color:#ff0000;">(1)</span> e um @implementation <span style="color:#ff0000;">(2)</span>. Sua propriedade <strong>window</strong> <span style="color:#ff0000;">(3)</span>, também recebe uma declaração @synthesize (vide capitulo 5). Mas é o conteúdo do método applicationDidFinishingLaunching <span style="color:#ff0000;">(4)</span> que  realmente interessa a você. Como você pode relembrar, essa é uma das mensagens de ciclo de vida do iPhone OS  que falamos nos capítulos anteriores. Sempre que uma aplicação do iPhone é totalmente  carregado na memória, vai enviar uma mensagem applicationDidFinishingLaunching: para  aplicação delegada, na execução desse método. Você vai notar há já existe um código para exibir a janela que será criada <span style="color:#ff0000;">(5)</span>.</p>
<p style="text-align:justify;">Para este projeto básico, você adicionará o seu novo código para que essa mesma rotina faça o objeto dizer &#8220;Olá, Mundo!&#8221;</p>
<p style="text-align:justify;"><strong>Escrevendo o código</strong></p>
<p style="text-align:justify;">Fui otimista ao dizer como é fácil escrever códigos utilizando o SDK do iPhone em capítulos anteriores. Contudo, o programa  &#8221;Olá, Mundo!&#8221; pode não ser tão fácil como um comando &#8220;print&#8221; em uma única declaração, mas é bastante simples, considerando que você está  lidando com um complexo ambiente de interface gráfica com janelas.  Como prometido, você escreverá tudo dentro do método applicationDidFinishingLaunching, como mostraremos:</p>
<address><em><strong>(void)applicationDidFinishLaunching:(UIApplication *)application {<br />
[window setBackgroundColor:[UIColor redColor]];                              <span style="color:#ff0000;">(1)</span><br />
CGRect textFieldFrame = CGRectMake(50, 50, 150,40); </strong></em><em><strong><em><strong><span style="color:#ff0000;">(2)</span></strong></em></strong></em><br />
<em><strong>UILabel *label = [[UILabel alloc] initWithFrame:textFieldFrame]; </strong></em><span style="color:#ff0000;"><strong>|</strong></span><br />
<em><strong>label.textColor = [UIColor whiteColor]; </strong></em><strong><strong><span style="color:#ff0000;">|</span></strong></strong><br />
<em><strong>label.backgroundColor = [UIColor redColor]; </strong></em><em><strong><em><strong><span style="color:#ff0000;">(3)</span></strong></em></strong></em><strong><strong></strong></strong><br />
<em><strong>label.shadowColor = [UIColor blackColor]; </strong></em><em><strong><em><strong></strong></em></strong></em><em><strong><em><strong></strong></em></strong></em><strong><strong><span style="color:#ff0000;">|</span></strong></strong><br />
<em><strong>label.font = [UIFont systemFontOfSize:24]; </strong></em><span style="color:#ff0000;"><strong>|</strong></span><br />
<em><strong>label.text = @&#8221;Hello, World!&#8221;; </strong></em><span style="color:#ff0000;"><strong>|</strong></span><br />
<em><strong>[window addSubview:label]; </strong></em><br />
<em><strong>[window makeKeyAndVisible]; </strong></em><br />
<em><strong>[label release]; </strong></em><br />
<em><strong>}</strong></em></address>
<p style="text-align:justify;">
<p style="text-align:justify;">Imaginando que este é o seu primeiro olhar num código real de Objective-C, vamos examinar tudo com certa profundidade.</p>
<p style="text-align:justify;"><strong>Sobre a janela</strong></p>
<p style="text-align:justify;">O código começa enviando uma mensagem para o objeto <strong>window</strong>, dizendo para ele para definir o seu background para azul <span style="color:#ff0000;">(1)</span>. Se você recordar da nossa discussão do arquivo header, dissemos que o Interface Builder foi quem criou a janela. O IBOutlet que foi definido no cabeçalho é o que permite fazer este tipo de manipulação.  Note que esta linha também faz uso de uma mensagem aninhada, o que havíamos prometido que aconteceria com uma certa freqüência. Aqui, você faz uma chamada para o objeto UIColor e solicita que  para ele envie a cor vermelha. Você, então,  passa isso para a sua janela.  Neste curso, vamos atingir um grande número de classes do UIKit sem explicar com muita  profundidade. Isso porque os objetos mais simples têm todas as interfaces padrões, a único complexidade  é, em particular as mensagens que eles aceitam. Se você se sentir como se fosse precisar de mais informações sobre uma classe, você deve olhar no guia de referência da Apple, disponível online em  developer.apple.com (ou no Xcode).</p>
<p style="text-align:justify;"><strong>Sobre Frames</strong></p>
<p style="text-align:justify;">Você irá agora definir onde o seu texto será colocado. Você inicia o processo usando CGRectMake para definir um retângulo <span style="color:#ff0000;">(2)</span>. Trabalharemos com Canvas da tela, o SDK utiliza um  grade com a origem (0,0) fixado na parte superior esquerda. Seu retângulo iniciará, portanto, 50 pixels à direita e 50 para baixo (50,50) a partir da origem. O resto dessa linha de código define o retângulo em 150 pixels de largura e 40 de altura, que é espaço suficiente para o seu texto.  Você vai usar este retângulo como um &#8220;Frame&#8221;, que é um dos métodos que você pode usar para definir uma visão da localização.</p>
<p style="text-align:justify;"><strong>Sobre Labels</strong></p>
<p style="text-align:justify;">O <strong><em>label</em></strong> é uma simples classe que lhe permite escrever texto na tela. Como você poderia esperar, o seu label começa com a própria criação de um objeto label <span style="color:#ff0000;">(3)</span>.  Note que ele segue o padrão de metodologia de criação de objetos aninhados que nós introduzimos nos capítulos anteriores. Primeiro você usa um objeto de classe para alocar o objeto, e então usamos um método de instância para inicializá-lo.  Depois de enviar uma série de mensagens para seu objeto, desta vez utilizando o ponto ( Oferecemos isso como uma variação da forma como você define o  janela da cor de fundo. Se preferir, você pode  utilizar o ponto window.backgroundColor lá, também. As duas maneiras de acessar propriedades são  totalmente equivalentes.  O mais importante dessas mensagens define o  texto do label. Você também pode definir um tamanho de fonte e algumas cores.  Você ainda pode dar ao texto uma atraente sombra preta, para demonstrar como é fácil fazer coisas legais  usando os objetos do iPhoneSO.  Cada objeto que você usar a partir de um Framework vai ter diversas propriedades, métodos e notificações  que você poderá tirar vantagem. O melhor lugar para procurar é  no guia de referências de classes.</p>
<p style="text-align:justify;"><strong>Executando o Alô Mundo!</strong></p>
<p style="text-align:justify;">Para compilar e executar no Xcode, escolha Build &gt; Build and Run a partir dos menus. Lembro que várias formas de se criar no XCODE e eu mostrei apenas como fazer no código, sem a utulização do Interface Buider para que você veja a quantidade de código que é inserido, sem o uso desta ferramenta. No próximo capítulo voce verá esta mesma aplicação sendo criada facilmente pelo IB sem digitar uma linha de código e veremos também outra aplicação mais complexa. Abraços.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webclaudio.wordpress.com/273/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webclaudio.wordpress.com/273/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webclaudio.wordpress.com/273/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webclaudio.wordpress.com/273/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webclaudio.wordpress.com/273/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webclaudio.wordpress.com/273/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webclaudio.wordpress.com/273/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webclaudio.wordpress.com/273/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webclaudio.wordpress.com/273/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webclaudio.wordpress.com/273/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webclaudio.wordpress.com/273/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webclaudio.wordpress.com/273/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webclaudio.wordpress.com/273/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webclaudio.wordpress.com/273/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=273&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webclaudio.wordpress.com/2009/04/25/curso-de-programacao-para-iphone-parte-8/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5edb029e2cc8684b40fe9f5bf9deb8b7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">webclaudio</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/04/titxcode.jpg" medium="image">
			<media:title type="html">titxcode</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/04/flex_xcode_template.jpg" medium="image">
			<media:title type="html">flex_xcode_template</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/04/tabela-1.jpg" medium="image">
			<media:title type="html">tabela-1</media:title>
		</media:content>
	</item>
		<item>
		<title>Curso de programação para IPHONE &#8211; Parte 7</title>
		<link>http://webclaudio.wordpress.com/2009/03/30/curso-de-programacao-para-iphone-parte-7/</link>
		<comments>http://webclaudio.wordpress.com/2009/03/30/curso-de-programacao-para-iphone-parte-7/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 00:34:34 +0000</pubDate>
		<dc:creator>webclaudio</dc:creator>
				<category><![CDATA[DESENVOLVIMENTO]]></category>
		<category><![CDATA[IPHONE]]></category>

		<guid isPermaLink="false">http://webclaudio.wordpress.com/?p=227</guid>
		<description><![CDATA[Olá programadores. Neste post iremos aprender sobre criação de objetos, gerenciamento de memória, eventos, delegates e data sources. Isto visto pelo comportamento do iPhone OS. Como você viu no capítulo anterior, o iPhoneOS tem uma complexa e profunda estrutura de classes. Duas das mais importantes são NSObject e UIResponder, que contêm muitos dos métodos e [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=227&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="mceTemp mceIEcenter">
<dl class="wp-caption aligncenter">
<dt class="wp-caption-dt"><img class="size-full wp-image-228" title="titmetodosiphoneos" src="http://webclaudio.files.wordpress.com/2009/03/titmetodosiphoneos.jpg?w=500&#038;h=150" alt="Métodos do iPhoneOS" width="500" height="150" /></dt>
</dl>
</div>
<p class="wp-caption-dd">
<p>Olá programadores. Neste post iremos aprender sobre criação de objetos, gerenciamento de memória, eventos, delegates e data sources. Isto visto pelo comportamento do iPhone OS.</p>
<p><span id="more-227"></span></p>
<p>Como você viu no capítulo anterior, o iPhoneOS tem uma complexa e profunda estrutura de classes. Duas das mais importantes são NSObject e UIResponder, que contêm muitos dos métodos e propriedades que você vai usar em toda a sua programação. Graças à herança, essas importantes funções (e outras) podem ser utilizadas por diversos objetos no iPhone OS.<br />
Nós vamos cobrir alguns destes métodos fundamentais aqui para apresentar uma única referência para o seu uso, mas esteja certo que nós vamos falar deles novamente quando nos deparamos para pela primeira vez com esses métodos em futuro capítulos.</p>
<h3>CRIAÇÃO DE OBJETOS</h3>
<p>Já anteriormente falamos como definir classes, mas, como nós dissemos às vezes as especificidades de como instâncias de objetos são criados a partir de classes dependem da estrutura de seu framework. No iPhoneOS é o NSObject que define como a criação do objeto trabalha. Você tem que satisfazer algumas diferentes interfaces que são utilizadas para apoiar a criação do objeto, mas todos eles, em última instância, são definidos em dois passos que utilizam o método de classe alloc e a instância de método init. O método alloc aloca a memória para o seu objeto e, em seguida, retorna o próprio objeto. O método init então configura algumas variáveis iniciais do método. Eles ocorrem normalmente através de uma única, aninhada mensagem:</p>
<p><span style="font-size:xx-small;font-family:Courier;"><strong><em>id novoObjeto = [[objetoDeClasse alloc] init];</em></strong></span></p>
<div><span style="font-size:xx-small;font-family:Courier;"><strong><em><br />
</em></strong></span></div>
<p>O método Alloc da classe NSObject deve sempre fazer a coisa certa para você. Contudo, quando você escrever uma nova subclasse você quase sempre vai escrever um novo método init, porque é ali onde você define as variáveis que tornam a sua classe o que ela é. Abaixo, mostro uma configuração padrão para um init, que seria exibido como parte do seu @implementation</p>
<p><img class="aligncenter size-full wp-image-235" title="exemplo42" src="http://webclaudio.files.wordpress.com/2009/03/exemplo42.jpg?w=418&#038;h=184" alt="exemplo42" width="418" height="184" /></p>
<p>Este código mostra todas as exigências habituais de um método init. Primeiro, ele chama o seu método pai (1) para iniciar a sua classe habitual de inicialização. Em seguida, põe-se qualquer instância de variável que deva ser criada (2). Por fim, ele retorna o objeto, geralmente com &#8220;return self&#8221;(3).</p>
<p>Este formato de Init é apenas uma das muitas maneiras que você pode usar para criar objetos no iPhone OS.</p>
<h4>O ARGUMENTO ALTERNATIVO</h4>
<p>Às vezes você deseja enviar um argumento junto com um init. Você pode fazer isso com uma inicialização de função que você nomeia usando o formato initWithArgument:. Exceto o fato de que você está lhe enviando um argumento, funciona exatamente como o código do init anterior. Aqui está outro exemplo extraída de código real que veremos nos próximos capítulos:</p>
<p><strong><em>[[UITextView alloc] initWithArgument: argumento];</em></strong></p>
<p>Métodos de Inicialização com argumentos  permitem que você crie objetos atípicos, criados da maneira que você escolher. Eles são bastante comuns na UIKit (Classe de interface com o usuário). Um método de inicialização com um argumento que merece mencionar é o<em> initWithCoder</em>: é um método especial de inicialização que é chamado sempre que você criar um objeto com o Interface Builder, e, portanto, ele é importante se você deseja fazer configurações nestes objetos.</p>
<h4>O MÉTODO FACTORY ALTERNATIVO</h4>
<p>Um último tipo de init apoiada através do iPhone OS é o método factory. Este é criado através de uma mensagem que cuida tanto da alocação de memória quanto para a inicialização. Todos os métodos factory são nomeadas com o formato objecttypeWithArgument:. Aqui está outro exemplo real:</p>
<p><strong><em>[UIButton buttonWithType:UIButtonTypeRoundedRect];</em></strong></p>
<p>Os métodos da classe factory se fazem um pouco mais claras, mas eles também têm a vantagem de cuidar da gestão de memória para você, que é o tema da nossa próxima categoria principal dos  métodos do iPhoneOS.</p>
<h4>RESUMO DE CRIAÇÃO DE OBJETOS</h4>
<p><img class="aligncenter size-full wp-image-254" title="resumoobjetos" src="http://webclaudio.files.wordpress.com/2009/03/resumoobjetos.jpg?w=500&#038;h=149" alt="resumoobjetos" width="500" height="149" /></p>
<h3>GERENCIAMENTO DE MEMÓRIA</h3>
<p>Devido à limitações de potência, o iPhoneOS não suporta coleta (Garbage Collector &#8211; coletor de lixo). Isso significa que cada objeto que é criado deve finalmente ter a sua memória liberada na mão, pelo menos, se você não pretende introduzir um vazamento de memória em seu programa. A regra fundamental da gestão de memória no iPhoneOS é esta: se você alocar a memória de um objeto, você deve liberá-lo. Isto é feito através de uma mensagem de liberação(o que é mais uma vez, herdado do NSObject):</p>
<p><em><strong>[objeto liberação]; </strong></em></p>
<p>Você enviará essa mensagem quando não utilizar mais seu objeto. Fazendo isso,  você fez o seu dever, como um bom programador. Note que eu disse que você só deve liberar a memória se você atribuíu a memória para ele. Se você olhar para trás para os métodos da classe factory que falámos no seção anterior, você verá que nós realmente não alocamos a memória para eles (porque não enviamos qualquer mensagem alloc), o que significa que não somos responsáveis por disponibilizá-la. Em vez disso, o objeto de classe que realmente fez a criação tem de limpar a sua memória. Como o sistema operacional sabe quando terminei de trabalhar com o objeto criado? Isso é feito através do maravilhoso autorelease.</p>
<h4>O AUTORELEASE ALTERNATIVO</h4>
<p>Se você é responsável pela criação de um objeto e que vai passá-la para fora para algumas outras classes de uso, você deve autorelease o objeto antes de enviá-la. Isto é feito com o método autorelease:</p>
<p><em><strong>[objeto autorelease];</strong></em></p>
<p>Em geral, você irá enviar a mensagem autorelease mesmo antes de devolver o objeto no final de um método. Quando um objeto sofre um autorelease, é supervisionado por uma especial  classe NSAutoreleasePool. O objeto é mantido vivo para o escôpo do  do método que o chamou e, em seguida, o NSAutoreleasePool o libera.</p>
<h4>RETENDO E CONTANDO</h4>
<p>Então como fazer, se quiser manter um objeto que tenha sido passado para você, e que  vai sofrer um autorelease? Nesse caso,  lhe enviamos uma mensagem retain (reter):</p>
<p><em><strong>[objeto retain];</strong></em></p>
<p>Quando você fizer isso, você está dizendo que você deseja ao objeto para ficar por perto, mas agora você irá se tornar responsável pela sua memória então: você deve enviar uma mensagem de release em algum ponto para manter o seu equilíbrio de memória.</p>
<p>Neste ponto, nós provavelmente devemos voltar e explicar a forma subjacente de que o iPhoneOS efectivamente gera a memória destes objetos. Ele o faz através da manutenção de uma contagem de objetos em uso. Por padrão, é definido como 1. Cada mensagem alloc e retain  incrementam o contador em 1, e cada mensagem de release reduz a contagem de 1. Quando a contagem cai para 0 (zero), a memória para o objeto é liberada. Portanto, toda a gestão de memória pode ser pensada como pares de mensagens. Se você equilíbrar cada alloc e retain com um release, o seu objeto será eventualmente liberado quando tiver terminado usá-lo.</p>
<h4>RESUMO DOS MÉTODOS DE GERENCIAMENTO DE MEMÓRIA</h4>
<p><img class="aligncenter size-full wp-image-262" title="resumomemoria" src="http://webclaudio.files.wordpress.com/2009/03/resumomemoria.jpg?w=500&#038;h=180" alt="resumomemoria" width="500" height="180" /></p>
<h4>EVENTO RESPONSE</h4>
<p>Segue a última categoria de métodos que iremos analisar para o iPhoneOS é o evento response (resposta). Ao contrário da criação de objeto e gestão de memória, vamos apenas abordar esta questão rapidamente, porque muito melhor documentado em um próximo post. O tema é tão importante que queremos por agora oferecer uma visão geral rápida por enquanto.</p>
<p>Existem três formas principais, que podem aparecer em eventos do iPhone: através de chamadas de eventos simples (ou actions  &#8211; ações), através de delegações de eventos, ou através de notificação.</p>
<p>Apesar dos métodos de todos os nossos tópicos anteriores serem derivados da classe NSObject, o evento response do iPhone vem do objeto UIResponder, enquanto uma notificação provém do NSNotificationCenter.</p>
<p>Você não precisa se preocupar em como acessar o método response e suas propriedades. Como o UIResponder,  eles herdam da classe UIKit, mas o NSNotificationCenter exigirá acesso especial.</p>
<p>Este capitulo será atualizado ainda esta semana. Pois ainda falta explicar melhor isto.</p>
<p>E por enquanto é só.  No próximo capitulo vamos começar já com o XCODE. Abraços.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webclaudio.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webclaudio.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webclaudio.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webclaudio.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webclaudio.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webclaudio.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webclaudio.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webclaudio.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webclaudio.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webclaudio.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webclaudio.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webclaudio.wordpress.com/227/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webclaudio.wordpress.com/227/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webclaudio.wordpress.com/227/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=227&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webclaudio.wordpress.com/2009/03/30/curso-de-programacao-para-iphone-parte-7/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5edb029e2cc8684b40fe9f5bf9deb8b7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">webclaudio</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/03/titmetodosiphoneos.jpg" medium="image">
			<media:title type="html">titmetodosiphoneos</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/03/exemplo42.jpg" medium="image">
			<media:title type="html">exemplo42</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/03/resumoobjetos.jpg" medium="image">
			<media:title type="html">resumoobjetos</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/03/resumomemoria.jpg" medium="image">
			<media:title type="html">resumomemoria</media:title>
		</media:content>
	</item>
		<item>
		<title>Curso de programação para IPHONE &#8211; Parte 6</title>
		<link>http://webclaudio.wordpress.com/2009/03/24/curso-de-programacao-para-iphone-parte-6/</link>
		<comments>http://webclaudio.wordpress.com/2009/03/24/curso-de-programacao-para-iphone-parte-6/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 03:20:48 +0000</pubDate>
		<dc:creator>webclaudio</dc:creator>
				<category><![CDATA[DESENVOLVIMENTO]]></category>
		<category><![CDATA[IPHONE]]></category>

		<guid isPermaLink="false">http://webclaudio.wordpress.com/?p=208</guid>
		<description><![CDATA[Olá&#8230; Neste artigo vamos conhecer um pouco do iPhoneOS seu principais recursos e principalmente suas limitações. Conhecer estas limitações é importantíssimo para evitar o eventual desligamento de sua aplicação pelo Apple App Killswitch (Espécie de guarda que desliga uma aplicação que esteja consumindo muitos recurso). A ANATOMIA DO IPHONEOS O Framework do iPhoneOs é dividido [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=208&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-211" title="titelementossintaxe2" src="http://webclaudio.files.wordpress.com/2009/03/titelementossintaxe2.jpg?w=500&#038;h=150" alt="titelementossintaxe2" width="500" height="150" /></p>
<p>Olá&#8230; Neste artigo vamos conhecer um pouco do iPhoneOS seu principais recursos e principalmente suas limitações. Conhecer estas limitações é importantíssimo para evitar o eventual desligamento de sua aplicação pelo Apple App Killswitch (Espécie de guarda que desliga uma aplicação que esteja consumindo muitos recurso).<br />
<span id="more-208"></span></p>
<h3>A ANATOMIA DO IPHONEOS</h3>
<p>O Framework do iPhoneOs é dividido em quatro grandes camadas, como mostrado na figura. Cada uma destas camadas contém uma variedade de frameworks que você pode ter acesso ao escrever programas no iPhone SDK. Geralmente, você deve preferir uma camada de alto nível quando você estiver codificando (os indicados em direção ao topo do diagrama).</p>
<p><img class="aligncenter size-full wp-image-212" title="camadasiphoneos" src="http://webclaudio.files.wordpress.com/2009/03/camadasiphoneos.jpg?w=142&#038;h=223" alt="camadasiphoneos" width="142" height="223" /><em><strong>Cocoa Touch</strong></em> é o framework que você deve se tornar mais familiarizado. Contém o framework UIKit e é nele que passaremos mais de 90 % deste curso.  A framework UIKit inclui suporte a &#8220;Window&#8221;,  suporte a eventos e suporte a gerenciamento de interfaces de usuário, e permite que você crie texto e páginas de web. Ele ainda funciona como sua interface com o acelerômetro , a câmera, a biblioteca de fotos, e informações específicas de cada dispositivo.</p>
<p><em><strong>Media </strong></em>é o lugar onde você pode ter acesso aos principais protocolos de áudio e vídeo embutido no iPhone. Existem quatro tecnologias gráficas presentes: OpenGL ES, EAGL (que liga<br />
objetos OpenGL para a sua &#8220;window&#8221; nativa), quartzo (que é uma engine da Apple baseado em desenho vectorial), e o Core Animation (que também é construída sobre Quartz). Outros frameworks<br />
dignos de nota incluem Core Audio, Open Audio Library, e Media Player.</p>
<p><em><strong>Core Services</strong></em> oferece os frameworks utilizados em todas as aplicações. Muitos deles são dados  conexos, tais como o interno Address Book framework. Core Services inclui também a  critical Foundation framework, o que inclui as principais definições dos tipos de dados orientados a objeto da Apple, tais como as suas matrizes e conjuntos.</p>
<p><em><strong>Core OS</strong></em> inclui o kernel-level software. Você pode acessar threading, arquivos, rede, I/O, e memória.</p>
<h3>A HIERARQUIA DOS OBJETOS DO IPHONE</h3>
<p>Dentro desses frameworks você será hábil para acessar a uma imensa riqueza das classes que estão dispostos em uma enorme hierarquia. Você verá muitas destas classes  utilizadas em todo este curso. Na Figura abaixo mostro muitas das classes que vamos usar ao longo dos vários artigos, organizados em hierarquia. Eles são apenas uma fração do que está disponível. Conforme mostrado na figura, os objetos que tem tem maior probabilidade de uso estão divididos em duas categorias gerais.</p>
<p><img class="aligncenter size-full wp-image-213" title="classesiphoneos" src="http://webclaudio.files.wordpress.com/2009/03/classesiphoneos.jpg?w=429&#038;h=290" alt="classesiphoneos" width="429" height="290" /></p>
<p><strong>AS CLASSES NS</strong></p>
<p>As classes NS provêm do Core Services Foundation framework (um Cocoa equivalente do Core Foundation framework), que contém um grande número de tipos de dados fundamentais e de outros objetos. Você deve usar as classes fundamentais do Cocoa como NSString e NSArray sempre que você puder. Isto porque eles tendem a se dar muito bem uns com os outros e com o framework UIKit, e portanto, é menos provável que você encontre erros bizarros. Apesar de não ser mostrado, NSNumber é outra classe que você deve usar sempre. Deve ser o seu principal objeto numérico quando você estiver fazendo qualquer tipo de trabalho complexo com números. Pode ser utilizada para reter muitos tipos de valores numéricos, flutuantes, inteiros e mais.  Os objetos que podem conter coleções de valores são NSArray (um array numérico) e NSDictionary (um array associativo). Somente estes insteressam mais nas classes NS.</p>
<p><strong>AS CLASSES UI</strong></p>
<p>A segunda categoria geral de classes contém as classes UI. Estes vêm do Cocoa Touch do framework do UIKit. Ela inclui todos os objetos gráficos que você usa, bem como todas as funcionalidades para o iPhone OS event model, muitos deles aparecem no UIResponder. Mas este é um outro tema que vamos voltar em breve.</p>
<p><strong>WINDOWS E VIEWS</strong></p>
<p>Como as classes IU demonstram, o iPhoneOS é profundamente enraizada na ideia de uma interface gráfica de usuário. Por isso, vamos terminar nossa introdução do iPhoneOS examinando algumas das principais abstrações gráfico embutidas no UIKit. Existem três abstrações principais: Windows, Views, e view controllers.  Um Window é algo que toma toda a tela do iPhone. Há apenas um deles para a sua aplicação, e é o recipiente para tudo o que a sua aplicação mostrar.  Um View é o conteúdo real mostrado na sua tela. Você pode ter vários deles, cada um abrangendo diferentes partes do Window (Janela)  ou fazendo coisas diferentes em tempos diferentes. Eles são todos derivados da classe UIView. No entanto, não basta pensar em um view como um recipiente vazio.</p>
<p>Atualmente, praticamente qualquer objeto que você usar a partir do UIKit será uma subclasse do UIView que apresenta uma grande quantidade de comportamentos herdados de si mesmo. Entre as grandes subclasses de UIView são UIControls, que lhe dará botões, cursores, e outros itens que os usuários podem manipular o seu programa com, e UIScrollableViews, que fornecerá aos usuários o acesso ao texto que não pode aparecer mais de uma vez. Um View controller faz o que seu nome sugere. Ela atua como o elemento controlador do modelo MVC e no processo de gerenciamento de telas cheias de texto, que é às vezes chamado por um view. Como tal, ele cuida de eventos e de actualização para o seu view.  Neste curso, dividimos os view controllers  em dois tipos.<br />
View Controllers Básicos  são aqueles que apenas gerenciam telas de texto (como o tab bar controller), enquanto view controllers avançados são aqueles que permitem que um usuário se desloque entre as várias páginas de texto (tais como o navigation bar controller e o tab bar controller). A figura abaixo mostra como esses três tipos de objetos interrelacionem.</p>
<p><img class="aligncenter size-full wp-image-218" title="iphoneosiphone" src="http://webclaudio.files.wordpress.com/2009/03/iphoneosiphone.jpg?w=500&#038;h=511" alt="iphoneosiphone" width="500" height="511" /></p>
<p>Windows, views, e view controllers são, em última análise, parte de uma visão hierarquia. Esta é uma árvore de objetos que começa com o Window na sua raiz. Um programa simples pode apenas ter um Window com um view nela. A maioria dos programas terá início com um Window, um view e um view controlller em que, talvez apoiados por view controllers adicionais, controlam views que deveraão ter os seus próprios subviews. Iremos descrever este conceito mais claramente nos próximos artigos, quando começarmos a olhar para a visualização básica de controladores. Até lá &#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webclaudio.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webclaudio.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webclaudio.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webclaudio.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webclaudio.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webclaudio.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webclaudio.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webclaudio.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webclaudio.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webclaudio.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webclaudio.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webclaudio.wordpress.com/208/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webclaudio.wordpress.com/208/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webclaudio.wordpress.com/208/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=208&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webclaudio.wordpress.com/2009/03/24/curso-de-programacao-para-iphone-parte-6/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5edb029e2cc8684b40fe9f5bf9deb8b7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">webclaudio</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/03/titelementossintaxe2.jpg" medium="image">
			<media:title type="html">titelementossintaxe2</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/03/camadasiphoneos.jpg" medium="image">
			<media:title type="html">camadasiphoneos</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/03/classesiphoneos.jpg" medium="image">
			<media:title type="html">classesiphoneos</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/03/iphoneosiphone.jpg" medium="image">
			<media:title type="html">iphoneosiphone</media:title>
		</media:content>
	</item>
		<item>
		<title>Curso de programação para IPHONE &#8211; Parte 5</title>
		<link>http://webclaudio.wordpress.com/2009/02/15/curso-de-programacao-para-iphone-parte-5/</link>
		<comments>http://webclaudio.wordpress.com/2009/02/15/curso-de-programacao-para-iphone-parte-5/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 06:03:12 +0000</pubDate>
		<dc:creator>webclaudio</dc:creator>
				<category><![CDATA[DESENVOLVIMENTO]]></category>
		<category><![CDATA[IPHONE]]></category>

		<guid isPermaLink="false">http://webclaudio.wordpress.com/?p=183</guid>
		<description><![CDATA[Olá! Neste capítulo vamos fechar o conteúdo sobre Objective-C para podermos ,no próximo, começar a falar do Sistema Operacional do Iphone, seus recursos e limitações. Aqui você aprenderá sobre &#8220;Properties&#8221;, &#8220;Categories&#8221; e &#8220;Protocols&#8221;. PROPERTIES (PROPRIEDADES)   O que estudamos até agora deveria ser suficiente para que você possa compreender (e escrever) um simples código de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=183&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-full wp-image-184" title="Titulo do Capitulo 5" src="http://webclaudio.files.wordpress.com/2009/02/titpropriedades.jpg?w=500&#038;h=150" alt="Titulo do Capitulo 5" width="500" height="150" /></p>
<p>Olá! Neste capítulo vamos fechar o conteúdo sobre Objective-C para podermos ,no próximo, começar a falar do Sistema Operacional do Iphone, seus recursos e limitações. Aqui você aprenderá sobre &#8220;Properties&#8221;, &#8220;Categories&#8221; e &#8220;Protocols&#8221;.</p>
<p><span id="more-183"></span></p>
<h2>PROPERTIES (PROPRIEDADES)</h2>
<p> <br />
O que estudamos até agora deveria ser suficiente para que você possa compreender (e escrever) um simples código de Objective-C. Mas há outra grande característica em Objective-C, que merece ampla discussão por causa de sua sintaxe única: a propriedade.</p>
<h2>O PROPÓSITO DAS PROPRIEDADES</h2>
<p>Para que variáveis instanciadas sejam encapsuladas, normalmente você tem que escrever toneladas de métodos get&#8217;s e set&#8217;s quando se trabalha com OOP. Isso pode ficar tedioso, e você também deve ser cuidadoso com a consistência, para que você não tenha dezenas de diferentes sintaxes para seus &#8220;acessories&#8221; (Variáveis de acesso a dados) e &#8220;mutators&#8221; (Métodos modificadores).<br />
Objective-C oferece uma solução para estes problemas: Você pode declarar uma instância de variável como uma propriedade. Ao fazer isso, você padroniza a variável de acesso e o método modificador de valor e cria getters e setters  automaticamente. O método de modificador  é chamado de &#8220;setVariable&#8221; e os de leitura  chamados com o nome escolhido para a variável de acesso.<br />
Por exemplo, se voltarmos para classe das maçãs que falamos no nosso grande exemplo anterior, definimos a nossa variável  &#8221;<strong><em>NSString * appleType</em></strong>&#8221; como uma propriedade, feito isso as seguintes declarações seriam automaticamente criadas:</p>
<p><strong><em>(void)setAppleType: (NSString *) newValue;<br />
(NSString *)appleType;</em></strong></p>
<p>Você nunca  vai ver estas declarações, mas eles estarão lá.</p>
<h2>CONFIGURANDO UMA PROPRIEDADE</h2>
<p>Você declara uma instância de variável como uma propriedade usando a diretiva @property, como parte de sua declaração @interface. Abaixo segue um exemplo do estou falando:</p>
<p><img class="aligncenter size-full wp-image-193" title="3º exemplo deste curso" src="http://webclaudio.files.wordpress.com/2009/02/exemplo3.jpg?w=500&#038;h=486" alt="3º exemplo deste curso" width="500" height="486" /></p>
<p>O cabeçalho do arquivo mostra que qualquer propriedade deve começar com a declaração de uma instância<br />
(1). A diretiva @property (2) , em seguida, repete essa declaração. Se desejar, você pode parar aqui. Você já implicitamente declarou seus acessadores, modificadores e métodos, ou você pode continuar e escrever os seus próprios métodos manualmente se assim quiser.<br />
Objective-C também irá escrever estes métodos para você, bastando apenas pedir para ele! Isto é feito com a declaração @sintetize na diretiva @implementation (3). Isto criará métodos acessadores que lêem e alteram a variável da forma que você está acostumado. O método de inserção(set) é, por padrão o principal, mas você pode escolher um outro método utilizando propriedades e atributos, e que nós vamos falar conforme estudamos.</p>
<p>USANDO ACESSADORES</p>
<p>Se você não for fazer nada extravagante, você pode usar imediatamente em sua classe os acessadores, modificadores e métodos, conforme mostrado nos seguintes três exemplos:</p>
<p><strong><em>NSString * choosenType = [AppleTree appleType];<br />
[AppleTree setAppleType: @ "Washington Vermelha"];<br />
[AppleTree setAppleType: myAppleType];</em></strong></p>
<p>Além de lhe prover automaticamente acessadores e modificadores, &#8220;@properties&#8221; também lhe dá acesso a um pouco de limpesa sintática, que pode tornar a sua utilização, muito mais fácil.</p>
<p><strong><em><span style="color:#ff0000;">Outra forma de notação</span></em></strong></p>
<p><span style="color:#000000;">Esiste uma outra forma de se acessar propriedades de classes no Objective-C e que lembra muito o formato normal de linguagens de programação orientadas a objeto que estamos acustamos. Porém como a idéia aqui é aprender a sintaxe do Objective-C eu desaprovo a utilização desta notação. Mas para fim de conhecimento saiba que você pode acessar as propriedades declarados na diretiva @property com a utilização do ponto &#8220;.&#8221;).</span></p>
<p><span style="color:#000000;">A sintaxe abaixo é a converção para esta notação usando o ponto do nosso último exemplo:</span></p>
<p><span style="color:#000000;"> <strong><em>NSString *ChoosenType = AppleTree.appleType;<br />
AppleTree.appleType = @&#8221;Washington Red&#8221;;<br />
AppleTree.appleType = myAppleType;</em></strong></span></p>
<p><span style="color:#000000;">Com isto em mãos você já está habil para escrever códigos simples. Existem outras diretivas de compilação para facilitar o desenvolvedor, mas acho melhor não aprendermos agora para que você digira melhor o que foi ensinado até aqui </span></p>
<p><span style="color:#000000;">Muitas vezes a arroba (@) é usada para criar variáveis de certos tipos. Ela é mais frequentemente usada para criar uma variável do tipo  String (NSString *). Vimos isso em alguns dos nossos exemplos. Você apenas deve incluir o símbolo @, seguido pelo o valor da seqüência de caracteres que você quer definir:</span></p>
<p><span style="color:#000000;"><strong><em>NSString * mySample @ = &#8220;O que tem isto a ver com maçãs?&#8221;;</em></strong></span></p>
<p><span style="color:#000000;">Ei tentarei no decorrer do curso, passar a maioria destas diretivas e gradativamente aumentar a complexidade dos códigos para o fácil aprendizado.</span></p>
<p> </p>
<h2><span style="color:#000000;">CATEGORIES E PROTOCOLS</span></h2>
<p><span style="color:#000000;">Existem dois elementos finais no Objective-C, que acho importante, pelo menos, tocar comentar: Categories e Protocols. Vou definir o que fazem, mas não iremos mergulhar profundamente em seus detalhes. Para saber mais, consulte a documentação da Apple que está no link deste Blog.</span></p>
<p><span style="color:#000000;"><strong>Categories</strong></span></p>
<p><span style="color:#000000;">Categories são usados se você quiser adicionar comportamento a uma classe sem herdar de outra (subclassing). Como sempre, você deve fazê-lo através da criação de um novo par de arquivos de código que contenham <strong><em>@interface</em></strong> e o <strong><em>@implementation</em></strong>. Desta vez você não precisa mais se preocupar com o nome da classe pai (Super), mas deve incluir um nome de categoria entre parênteses, como se segue:</span></p>
<p><span style="color:#000000;"><strong><em>@interface AppleTree (MyAppleChanges)<br />
@implementation AppleTree (MyAppleChanges)</em></strong></span></p>
<p><span style="color:#000000;">Como resultado, os métodos e as variáveis categorizados que você descreveria para a classe serão adicionados ao núcleo da classe de definição do seu programa.<br />
Nós não usaremos categories neste curso.</span></p>
<p><span style="color:#000000;"><strong><em>Protocols</em></strong></span></p>
<p><span style="color:#000000;">Um protocolo é efetivamente um comportamento que não é vinculado a uma classe. Nele se declara um conjunto de métodos, listando seus argumentos e os seus retornos. As Classes podem, em seguida, afirmar que eles estão usando este protocolo na sua própria declaração @interface. </span></p>
<p><span style="color:#000000;">Por exemplo, se tivéssemos um protocolo <strong><em>Crescer </em></strong>que é utilizada por plantas e animais parecidos, poderíamos definir a sua utilização como segue:</span></p>
<p><strong><em><span style="color:#000000;">@</span><span style="color:#000000;">interface AppleTree: UrTree &lt;Crescer&gt;</span></em></strong></p>
<p><span style="color:#000000;">A classe AppleTree seria assim capaz de responder a todos os métodos definidos no protocolo Crescer.<br />
Veremos alguns exemplos de Protocols no decorrer do curso.</span></p>
<p><span style="color:#000000;">Abaixo um resumo de tudo que aprendemos até agora sobre a sintaxe do Objective-C:</span></p>
<p><span style="color:#000000;"><img class="aligncenter size-full wp-image-201" title="resumo1" src="http://webclaudio.files.wordpress.com/2009/02/resumo1.jpg?w=500&#038;h=468" alt="resumo1" width="500" height="468" /></span></p>
<p><span style="color:#000000;">Bom acho que o fundamental já foi explicado, e o que faremos no próximo capítulo será aprender sobre o S.O. do iPhone. Tentarei resumir tudo num único capítulo para podermos em seguida meter a mão na massa e fazermos nosso primeiro programa no iPhone.</span></p>
<p><span style="color:#000000;">Até lá&#8230;</span></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/webclaudio.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/webclaudio.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/webclaudio.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/webclaudio.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/webclaudio.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/webclaudio.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/webclaudio.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/webclaudio.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/webclaudio.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/webclaudio.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/webclaudio.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/webclaudio.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/webclaudio.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/webclaudio.wordpress.com/183/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=webclaudio.wordpress.com&amp;blog=6401000&amp;post=183&amp;subd=webclaudio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://webclaudio.wordpress.com/2009/02/15/curso-de-programacao-para-iphone-parte-5/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/5edb029e2cc8684b40fe9f5bf9deb8b7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">webclaudio</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/02/titpropriedades.jpg" medium="image">
			<media:title type="html">Titulo do Capitulo 5</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/02/exemplo3.jpg" medium="image">
			<media:title type="html">3º exemplo deste curso</media:title>
		</media:content>

		<media:content url="http://webclaudio.files.wordpress.com/2009/02/resumo1.jpg" medium="image">
			<media:title type="html">resumo1</media:title>
		</media:content>
	</item>
	</channel>
</rss>
