Postado 20 de fevereiro de 201214 anos comment_283394 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. Denunciar
Postado 20 de fevereiro de 201214 anos comment_283441 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 201214 anos por Artur Felipe Denunciar
Postado 21 de fevereiro de 201214 anos Autor comment_283566 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> Denunciar
Participe do debate
Você pode postar agora e se registrar depois. Se você tem uma conta, entre agora para postar com ela.