Antes de conhecer os atributos de @property, você deve saber qual é o uso de @property.
O @property oferece uma maneira de definir as informações que uma classe pretende encapsular. Se você declarar um objeto / variável usando @property , esse objeto / variável estará acessível para outras classes que importam sua classe.
Se você declarar um objeto usando @property no arquivo de cabeçalho, precisará sintetizá-lo usando @synthesize no arquivo de implementação. Isso torna o objeto compatível com KVC . Por padrão, o compilador sintetizará métodos de acessador para esse objeto.
Os métodos de acesso são: setter e getter.
Exemplo: .h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m
@implementation XYZClass
@synthesize name;
@end
Agora o compilador sintetizará métodos de acessador para o nome .
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
Lista de atributos de @property
atômico, não atômico, reter, copiar, somente leitura, escrever novamente, atribuir, forte, getter = método, setter = método, unsafe_unretained
atômico é o comportamento padrão. Se um objeto é declarado como atômico, ele se torna seguro para threads. Segura por thread significa que, por vez, apenas um thread de uma instância específica dessa classe pode ter o controle sobre esse objeto.
Se o encadeamento estiver executando o método getter, outro encadeamento não poderá executar o método setter nesse objeto. Está lento.
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
- nonatomic não é seguro para threads. Você pode usar o atributo de propriedade não atômica para especificar que os acessadores sintetizados simplesmente configuram ou retornam um valor diretamente, sem garantias sobre o que acontece se esse mesmo valor for acessado simultaneamente a partir de diferentes threads.
Por esse motivo, é mais rápido acessar uma propriedade não atômica do que uma atômica.
@property (nonatomic)NSString *name;
- reter é necessário quando o atributo é um ponteiro para um objeto.
O método setter aumentará a contagem de retenção do objeto, para que ele ocupe memória no pool de liberação automática.
@property (retain)NSString *name;
- copiar Se você usa cópia, não pode usar reter. O uso da instância de cópia da classe conterá sua própria cópia.
Mesmo que uma sequência mutável seja definida e alterada posteriormente, a instância captura qualquer valor que tiver no momento em que é definida. Nenhum método setter e getter será sintetizado.
@property (copy) NSString *name;
agora,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
O nome permanecerá inalterado.
- readonly Se você não deseja permitir que a propriedade seja alterada pelo método setter, você pode declarar a propriedade somente leitura.
O compilador irá gerar um getter, mas não um setter.
@property (readonly) NSString *name;
- readwrite é o comportamento padrão. Você não precisa especificar o atributo readwrite explicitamente.
É o oposto de somente leitura.
@property (readwrite) NSString *name;
- assign gera um setter que atribui o valor diretamente à variável de instância, em vez de copiá-lo ou retê-lo. É melhor para tipos primitivos como NSInteger e CGFloat, ou objetos que você não possui diretamente, como delegados.
Lembre-se de que reter e atribuir são basicamente intercambiáveis quando a coleta de lixo está ativada.
@property (assign) NSInteger year;
- forte é um substituto para reter.
Ele vem com o ARC.
@property (nonatomic, strong) AVPlayer *player;
- getter = method Se você deseja usar um nome diferente para um método getter, é possível especificar um nome personalizado adicionando atributos à propriedade.
No caso de propriedades booleanas (propriedades que têm um valor SIM ou NÃO), é habitual que o método getter comece com a palavra "é"
@property (getter=isFinished) BOOL finished;
- setter = method Se você deseja usar um nome diferente para um método setter, é possível especificar um nome personalizado adicionando atributos à propriedade.
O método deve terminar com dois pontos.
@property(setter = boolBool:) BOOL finished;
- unsafe_unretained Existem algumas classes no Cocoa e no Cocoa Touch que ainda não suportam referências fracas, o que significa que você não pode declarar uma propriedade fraca ou uma variável local fraca para acompanhá-las. Essas classes incluem NSTextView, NSFont e NSColorSpace, etc. Se você precisar usar uma referência fraca para uma dessas classes, deverá usar uma referência não segura.
Uma referência insegura é semelhante a uma referência fraca, pois não mantém seu objeto relacionado ativo, mas não será definido como nulo se o objeto de destino for desalocado.
@property (unsafe_unretained) NSObject *unsafeProperty;
Se você precisar especificar vários atributos, basta incluí-los como uma lista separada por vírgula, assim:
@property (readonly, getter=isFinished) BOOL finished;