Wagner Kobayashi Postado 20 de fevereiro de 2012 Denunciar Compartilhar Postado 20 de fevereiro de 2012 Estou estudando as vídeo-aulas de desenvolvimento iOS da Universidade de Stanford. Na aula "Lecture 2 - My First iOS App", sobre uma calculadora RPN, eu notei que o professor usa a sintaxe em @synthesize: <code>@synthesize operandStack = _operandStack;</code> Por que ele usa "_operandStack" com underline? Uma explicação resumida que se dá, posteriormente é a seguinte: "You've learned hot to... use "_propertyname" to choose the name @synthesize uses for its backing instance variable" O que ele quis dizer com isso? Alguém poderia dar uma ajuda? Tenho noção de Java OO e fazem 2 semanas que estou lendo e estudando materiais de Objective-C. Mas ainda tenho algumas dúvidas. Citar Link para o comentário Compartilhar em outros sites Mais opções de compartilhamento…
Artur Felipe Postado 20 de fevereiro de 2012 Denunciar Compartilhar Postado 20 de fevereiro de 2012 (editado) Isso é simplesmente o padrão de uso da propriedade Uma propriedade é apenas uma marcação para um par de métodos, no caso a propriedade operandStack apenas marca o get 'operandStack' e o set 'setOperandStack' _operandStack seria a variável instanciada usada dentro desses métodos ... o @synthesize deve gerar um getter e setter semelhante a isso por exemplo ... - (NSString *) operandStack: <------------ a Assinatura do método { return _operandStack; } - (void) setOperandstack:(NSString *)value <------------ a Assinatura do método { [value retain]; [_operandStack release]; <------------- Liberação de qualquer valor anterior na variável instanciada. _operandStack = value; <-------------- Variável com valor sendo instanciado (não sei se existe essa palavra mas enfim ... ) } Editado 20 de fevereiro de 2012 por Artur Felipe Citar Link para o comentário Compartilhar em outros sites Mais opções de compartilhamento…
Wagner Kobayashi Postado 21 de fevereiro de 2012 Autor Denunciar Compartilhar Postado 21 de fevereiro de 2012 Valeu pela explicação, Artur Felipe. Se bem que foi um pouco de grego para mim (hehehe). Um dos códigos em questão está abaixo. Eu fui fazendo o exercício com os objetos, variáveis e métodos traduzindo para o português. Sei que o @synthesize cria os getters e setters e permite o "dot notation". Abaixo, estão 2 códigos que fui montando. Se eu entendi direito, o uso de "_nomeDaClasse" é usado apenas para instanciar o objeto? Se eu não usasse (como venho fazendo), qual seria o problema? No caso citado (código verde), não seria mais simples eu colocar apenas a linha: <code>NSMutableArray *operacaoPilha = [[NSMutableArray alloc] init];</code> e tirar o @property, @synthesize e outros? <code>// // CalculadoraCerebro.m // Calculadora // #import "CalculadoraCerebro.h" @interface CalculadoraCerebro() @property (nonatomic, strong) NSMutableArray *operacaoPilha; @end @implementation CalculadoraCerebro @synthesize operacaoPilha = _operacaoPilha; - (NSMutableArray *)operacaoPilha { if (!_operacaoPilha) { // ou "if (operacaoPilha == nil)" _operacaoPilha = [[NSMutableArray alloc] init]; } return _operacaoPilha; } - (void)pressionarOperador:(double)operador; { NSNumber *operadorObjeto = [NSNumber numberWithDouble:operador]; [self.operacaoPilha addObject:operadorObjeto]; } - (double)popOperador { NSNumber *operadorObjeto = [self.operacaoPilha lastObject]; if (operadorObjeto) [self.operacaoPilha removeLastObject]; return [operadorObjeto doubleValue]; } - (double)fazerOperacao:(NSString *)operacao; { double result = 0; if ([operacao isEqualToString:@"+"]) { result = [self popOperador] + [self popOperador]; } else if ([@"*" isEqualToString:operacao]) { result = [self popOperador] * [self popOperador]; } else if ([operacao isEqualToString:@"-"]) { double subtracao = [self popOperador]; result = [self popOperador] - subtracao; } else if ([operacao isEqualToString:@"/"]) { double divisao = [self popOperador]; if (divisao) result = [self popOperador] / divisao; } [self pressionarOperador:result]; return result; } @end</code> --- <code>// // CalculadoraViewController.m // Calculadora // #import "CalculadoraViewController.h" #import "CalculadoraCerebro.h" // o método boleano sempre inicia em NO @interface CalculadoraViewController () @property (nonatomic) BOOL usuarioNoMeioDaOperacao; @property (nonatomic, strong) CalculadoraCerebro *cerebro; @end @implementation CalculadoraViewController @synthesize display; // @synthesize cria getters e setters @synthesize usuarioNoMeioDaOperacao; @synthesize cerebro = _cerebro; - (CalculadoraCerebro *)cerebro { if (!_cerebro) _cerebro = [[CalculadoraCerebro alloc] init]; return _cerebro; } - (IBAction)digitoPressionado:(UIButton *)sender { NSString *digito = sender.currentTitle; if (self.usuarioNoMeioDaOperacao) { // na primeira vez, sempre a variável vai estar NO self.display.text = [self.display.text stringByAppendingString:digito]; } else { self.display.text = digito; self.usuarioNoMeioDaOperacao = YES; // depois de digitado, o else muda o estado para YES } } - (IBAction)enterPressionado { [self.cerebro pressionarOperador:[self.display.text doubleValue]]; self.usuarioNoMeioDaOperacao = NO; } - (IBAction)operacaoPressionada:(id)sender { if (self.usuarioNoMeioDaOperacao) { [self enterPressionado]; } NSString *operacao = [sender currentTitle]; double result = [self.cerebro fazerOperacao:operacao]; self.display.text = [NSString stringWithFormat:@"%g", result]; } @end</code> Citar Link para o comentário Compartilhar em outros sites Mais opções de compartilhamento…
Posts Recomendados
Participe do debate
Você pode postar agora e se registrar depois. Se você tem uma conta, entre agora para postar com ela.