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!

Patrick
fonte
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
BoltClock
fonte
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].

Hariprasad.J
fonte
-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.

Thomson Comer
fonte
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