terça-feira, 27 de novembro de 2012

As propriedades no Objective-C

Olá a todos!!!

Talvez um assunto que tenha ficado meio obscuro nas última postagens diga respeito às propriedades. E realmente, entender todas as formas de declaração destas não é algo tão trivial em Objective-C.

As propriedades foram criadas no Objective-C 2.0 e possuem como sintaxe básica a declaração da propriedade no .h e a sua sintetização no .m


Dessa forma já é possível ter métodos getter e setter adequados para a maioria dos casos, mas não todos. Assim, criaram-se atributos para as propriedades que sinalizam como o código da @property deverá ser gerado.


É importante ressaltar que é possível inserir qualquer quantidade de número de atributos de propriedade, bastando inserir uma vírgula entre elas. Além disso, qualquer um desses estados podem ser implementados manualmente. Os atributos para a propriedade possíveis são:

  • @property(getter = nomeVar)
    • Informamos aqui qual será o método em questão que será o getter;
    • Lembre-se de implementar em seu getter todos os comportamentos que você inseriu na assinatura de sua @property.
    • Pela convenção do Objective-C, getters devem possuir o mesmo nome da variável se o prefixo get.
  • @property(setter = setNomeVar)
    • Informamos aqui qual será o método em questão que será o setter.
  • @property(readwrite)
    • A propriedade, por padrão, já vem definida com esse estado. Isso diz à propriedade que ela irá ser LIDA e SOBRESCRITA.
  • @property(readonly)
    • A propriedade pode apenas ser lida e não sobrescrita, ou seja, o usuário terá acesso somente ao GETTER.
  • @property(assign)
    • A propriedade, por padrão, já vem definida com esse estado. Este define, basicamente, que o setter será apenas uma atribuição da variável recebida na variável da instância.
  • @property(retain)
    • Marcar a propriedade com retain significa que a instância recebida em SETTER terá seu retain count incrementado em 1, ou seja, tomaremos posse do objeto atribuído;
    • Em 95% que estamos recebendo uma referência, implementamos esse estado na propriedade.
  • @property(copy)
    • Estabelecemos nesse caso que faremos uma cópia do objeto atribuído no SETTER.
  • @property(atomic)
    • A propriedade, por padrão, já vem definida com esse estado. Quando uma property esta definida como atomic, seu getter e setter serão implementados levando em consideração um ambiente multithread. Ou seja, possuirão mutexes que impedirão leitura e escrita mútua pelas threads por meio da directiva @synchronize.
  • @property(nonatomic)
    • Marcamos a propriedade com esse estado quando não queremos que ela possua mutexes que evitem leitura e escrita mútua. É certo marcar a property com esse atributo quando temos certeza que nossa classe não será utilizada em um ambiente multithread.

Além das configurações mencionadas, ainda podemos configurar o nosso @synthesize. Observe:

  • @synthesize varName = _varName
    • Quando a propriedade não possui o mesmo nome da variável, devemos realizar essa operação, onde varName é o nome da propriedade e _varName é o nome da variável.
  • @dynamic
    • Usamos esta directiva no lugar de @synthesize quando queremos que a nossa propriedade aponte para os métodos GETTER e SETTER de uma superclasse. Na prática, evita Warnings do compilador. Para saber mais, leia este artigo;
    • Em geral, as configurações do @dynamic são idênticas ao @synthesize.

Neste post fico por aqui. Até a próxima!

Nenhum comentário:

Postar um comentário

Obrigado por deixar a sua participação!