Ir para conteúdo
Visualizar no app

Uma forma melhor de navegar. Saiba mais.

MM Fórum

Um app em tela cheia na sua Tela de Início com notificações push, avisos e mais.

Para instalar este app no iOS/iPadOS
  1. Toque no ícone de Compartilhamento no Safari
  2. Role o menu e toque em Adicionar à Tela de Início.
  3. Toque em Adicionar no canto superior direito.
Para instalar este app no Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Uso de underline em @synthesize

Featured Replies

Postado

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.

  • Respostas 2
  • Visualizações 1.2k
  • Criado
  • Última resposta

Top Postadores Neste Tópico

Postado

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 por Artur Felipe

Postado
  • Autor

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>

Participe do debate

Você pode postar agora e se registrar depois. Se você tem uma conta, entre agora para postar com ela.

Visitante
Responder este tópico…

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Conta

Navegação

Buscar

Buscar

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.