Pergunta

Eu acredito que eu entendo propriedades para a maior parte. A minha pergunta é, se eu tiver uma propriedade para uma variável de instância, e estou a criação ou recuperá-lo a partir de dentro de um método no meu arquivo de implementação, que eu deveria usar self.myProperty ou apenas myProperty? Eu sei que qualquer um dos dois trabalhos, mas eu vi convenções mistas, às vezes código acessa a variável diretamente e outras vezes através da propriedade.

Existe uma razão técnica para fazer isso? Trata-se apenas de convenções / preferência pessoal? E eu não estou referindo-se aos casos em que o nome do parâmetro de um colide método com o nome da instância variável, que pode ser uma razão para usar a propriedade ( Pelo menos, em outros idiomas, que eu não sei sobre isso um ). Presumo que, quando se usa a propriedade no âmbito da implementação, eles querem tirar proveito da maneira em que eles declararam a propriedade ( ou seja atômica, reter ), assim como por exemplo em um método, que se pode fazer :

self.myProperty = [someObject someAutoReleasedObject];

em vez de:

myProperty = [[someObject someAutoReleasedObject] retain];

Esta é a razão? Então, existem apenas alguns situações em que seria bom usar a propriedade?

Eu sou novo para Objective-C, e esta é uma das poucas coisas que tem me confundiu. Até agora eu apenas acessada a variável de instância diretamente, sob o mais provável falsa suposição de que atravessar a propriedade realmente chama / envia um método / mensagem e adiciona uma sobrecarga desnecessária. Eu tenho certeza que eu estou errado com isso, mas mesmo que a diferença de sobrecarga é desprezível (Se há mesmo qualquer), por um escolheria para adicioná-lo em quando se pode simplesmente acessar diretamente a variável?

Eu tenho certeza que eu estou errado no meu pensamento, que é por isso que eu estou pedindo aqui.

Foi útil?

Solução

Em primeiro lugar, você não deve usar setters ou getters em init ou dealloc de acordo com a documentação da Apple (e por boas razões).

Além disso, você deve geralmente usar o setter para definir a variável, se houver um.

Normalmente eu não me incomodo usando o getter para acessar o ivar de dentro da aplicação, mas há momentos em que é necessário. Em particular, se você espera que o getter pode fazer alguma caclulation ou verificação, ou se você deseja permitir para subclasses para substituir o comportamento.

Certamente, usando o getter na implementação é mais geral e mais seguro, mas também é geralmente inútil e um desperdício. Faça a sua escolha.

Usando o setter é importante, pois dá uma opertunity para outro código para observar as mudanças (Chave Valor de Observação), bem como subclasses a chance de substituir o setter e fazer quaisquer outros ajustes necessários.

No entanto, uma coisa que eu recomendo é usar um nome diferente para o seu Ivar e sua propriedade. A convenção normal é um prefixo sublinhado (_), embora eu pessoalmente uso i_ como o prefixo para evitar qualquer confusão com o uso privado da Apple. Dessa forma, você não pode acidentalmente usar o errado:

self.name // use property
i_name // use ivar
self.i_name // syntax error
name // syntax error

Outras dicas

Se você está expondo a propriedade para o mundo exterior e você estiver usando-o internamente você deve estar usando a propriedade em todo o código. A razão é o encapsulamento. Digamos que você tenha uma propriedade "Id" para someObj. Digamos que em algum momento você decidir substituir os comporta maneira Id (talvez você começou com Id ser um var membro da classe, e através da evolução torna-se um pedaço de dados que são recuperados do banco de dados). Agora você tem que ir através de sua implementação de classe e substituir todas as referências ao var membro com chamadas de banco de dados. Se você tivesse self.Id, você só tem que substituir o getter.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top