Se eu especificar um atributo para uma propriedade definida, isso terá algum efeito na configuração padrão do atributo?
Por exemplo, as seguintes declarações são iguais, pois atomic, readwrite and strong
são definidas por padrão
@property(atomic,readwrite,strong)NSString *name;
@property NSString *name;
se eu declarar a propriedade com assign
atributo, ela mantém os demais atributos?
essas 2 afirmações são equivalentes?
@property (assign) NSString* name;
@property (assign,atomic,readwrite,strong) NSString * name;
e o que acontece se eu alterar uma propriedade padrão, ela mantém a outra na configuração padrão? essas 2 afirmações são equivalentes?
@property (nonatomic,weak) NSString * name;
@property (nonatomic,weak,readwrite) NSString * name;
Estou perguntando isso porque quando configuro uma propriedade assign
apenas com atributo, parece que o strong
atributo não é mais aplicado, pois quando configuro com outra variável, ele não retém referência.
Os vários atributos das propriedades do Objective-C são agrupados em conjuntos de valores mutuamente exclusivos. Você só pode escolher um valor de cada grupo.
Portanto, você não pode criar uma propriedade que seja
assign
andstrong
. Só pode ser um deles.Escolher um valor de cada grupo não afeta os valores de nenhum outro grupo.
Para um tipo de referência (
NSString *
por exemplo), os padrões são atômicos, leitura e gravação e fortes, como você declarou. A escolha explícita de um valor não padrão para um valor não altera os outros padrões.Você perguntou:
Não, uma vez que você escolhe
assign
,strong
não é usado. Por outro lado, nunca useassign
com um tipo de referência, a menos que você realmente tenha um motivo bom e totalmente compreendido para fazê-lo.Em outras palavras, são iguais:
Porém, novamente, não use
assign
com tipos de referência.Você perguntou se o seguinte é equivalente:
Sim, estes são os mesmos. Eu uso o primeiro o tempo todo e a propriedade é sempre leitura e gravação também.
Eu disse que você só pode escolher um valor de cada grupo. Na verdade, isso é apenas parcialmente verdade. Na interface pública de uma classe você pode declarar uma propriedade como somente leitura. E então, na extensão da classe privada da classe, você pode declarar novamente a propriedade como leitura e gravação. Por exemplo:
arquivo .h:
arquivo .m
O que isso faz é expor uma propriedade somente leitura aos usuários da classe, mas permitir que a implementação privada da classe também grave valores na propriedade.