Usando uma propriedade BOOL


111

A Apple recomenda declarar uma propriedade BOOL desta forma:

@property (nonatomic, assign, getter=isWorking) BOOL working;

Como estou usando propriedades Objective-C 2.0 e notação de ponto, eu acesso essa propriedade usando self.working. Sei que também poderia usar [self isWorking]- mas não preciso.

Portanto, como estou usando a notação de ponto em todos os lugares, por que devo definir uma propriedade extra? Estaria tudo bem simplesmente escrever

@property (nonatomic, assign) BOOL working;

Ou eu tenho alguma vantagem escrevendo getter=isWorkingno meu caso (uso de notação de ponto)?

Obrigado!


4
Esta não é uma recomendação baseada na semântica? então myCar.isWorking seria semanticamente mais preciso do que myCar.working
basta compilar

Respostas:


206

A Apple simplesmente recomenda declarar um isXgetter para fins estilísticos. Não importa se você personaliza o nome do getter ou não, contanto que use a notação de ponto ou a notação de mensagem com o nome correto. Se você vai usar a notação de ponto, não faz diferença, você ainda acessa pelo nome da propriedade:

@property (nonatomic, assign) BOOL working;

[self setWorking:YES];         // Or self.working = YES;
BOOL working = [self working]; // Or = self.working;

Ou

@property (nonatomic, assign, getter=isWorking) BOOL working;

[self setWorking:YES];           // Or self.working = YES;, same as above
BOOL working = [self isWorking]; // Or = self.working;, also same as above

4
Certamente tem mais a ver com ser compatível com a codificação de valores-chave do que apenas fins estilísticos?
Jasarien

5
É um pouco estranho que a Apple recomende declarar esses isXgetters, mas o Xcode não é capaz de listá-los no pop-up de preenchimento automático. (No meu exemplo) workingestá listado lá, mas isWorkingnão está. Portanto, não vejo nenhum benefício em declarar getters BOOL. Tenho que fazer mais para poder usá-los (declarar o getter), mas obtenho menos (sem preenchimento automático).
Patrick

4

A Apple recomenda para fins estilísticos. Se você escrever este código:

@property (nonatomic,assign) BOOL working;

Então você não pode usar [object isWorking].
Ele mostrará um erro. Mas se você usar o código abaixo significa

@property (assign,getter=isWorking) BOOL working;

Portanto, você pode usar [object isWorking].


-26

Não há benefício em usar propriedades com tipos primitivos. @propertyé usado com pilha alocada NSObjectscomo NSString*, NSNumber*, UIButton*, e etc, porque assessores memória gerenciada são criados de forma gratuita. Quando você cria um BOOL, o valor é sempre alocado na pilha e não requer nenhum acessador especial para evitar vazamento de memória. isWorkingé simplesmente a maneira popular de expressar o estado de um valor booleano.

Em outra linguagem OO, você faria uma variável private bool working;e dois acessores: SetWorkingpara o setter e IsWorkingpara o acessador.


1
Você não está respondendo à pergunta dele, a saber, qual é o propósito de nomear explicitamente getter algo diferente da propriedade (ele não está perguntando se as propriedades são uma boa ideia). Além disso, as propriedades permitem KVO e KVC, portanto, o que você quer dizer é enganoso.
Martin Gjaldbaek

Você está certo que esqueci o uso de KVO e KVC com propriedades primitivas. Acho que todos no tópico estão respondendo à sua pergunta sobre isWorking - é uma convenção de nomenclatura.
Thomson Comer

25
Isso é totalmente incorreto; @propertydestina-se a ser usado com tipos primitivos e, apenas por motivos de consistência, tem vantagens significativas. Além disso, alguns tipos primitivos (tipos de 64 bits em algumas CPUs de 32 bits e tipos de 128 bits em muitas CPUs de 32 e 64 bits) não são atômicos na atribuição; @propertyA atomicidade de também pode ser vantajosa nesses casos.
bbum 01 de

1
Interessante - mas como diabos eu vou saber disso? :) Isso é uma implicação dos atributos atomice nonatomic?
Thomson Comer
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.