Definição de Propriedades de Resumo em objective-C
-
25-09-2019 - |
Pergunta
Uma das coisas que eu estive lutando, enquanto a quebra em objective-C de programação, é a compreensão de como manipular propriedades.Eu sou, talvez, fora da minha zona de conforto, utilizando uma adequada codificação de idioma em oposição às linguagens de script que eu estou acostumado, então, a declarar coisas em arquivos de cabeçalho e ficheiros de implementação é algo que me confunde um pouco.
Vamos dizer que eu tenho uma Seqüência de caracteres.Gostaria de acrescentar algum texto em que seqüência.O que faço para declarar no arquivo de cabeçalho e o que eu faço no arquivo de implementação para permitir que isso funcione corretamente, e que são @propriedade e @sintetizar?
Solução
Na maus velhos tempos, antes de objective-C 2.0, era comum escrever getters e setters para as suas variáveis de instância e.g.
@interface Foo : NSObject
{
@private
id foo;
}
-(void) setFoo: (id) newFoo;
-(id) foo;
@end
@implementation Foo
// need dealloc to release foo too.
-(void) setFoo: (id) newFoo
{
[newFoo retain];
[foo release];
foo = newFoo;
}
-(id) foo
{
return foo;
}
@end
E isso é só no single threaded ambiente.Houve ainda mais o material necessário para multi-aplicações.
Propriedades de proporcionar uma boa forma abreviada acima.O @propriedade substitui ambas as declarações de interface, bem como dando o chamador melhores dicas sobre a semântica do getter e setter.Ele também permite que você @sintetizar os acessores assim, o compilador irá gerar o código automaticamente (você não tem para @sintetizá-los, você pode fornecer suas próprias implementações se você quiser).Todos os itens acima podem ser substituídos por
@interface Foo : NSObject
{
@private
id foo;
}
@property (nonatomic, retain) id foo;
@end
@implementation Foo
// need dealloc to release foo too.
@synthesize foo;
@end
Que guarda muito de escrever, mas também você pode ver a partir da interface que setFoo:manterá o seu valor e que a propriedade não é seguro para uso (para definir ou get) em um ambiente multithread (sem algum outro mecanismo de bloqueio).
Outras dicas
@property
- declara uma propriedade com modificadores de acesso e memória. As propriedades podem ser leituras ou readwrite, não atômicas ou atômicas (segurança de threads), atribuir/reter/copiar gerenciadas. Na verdade, você pode declarar métodos simples de getter e setter como fizemos na era do tigre, mas declarando um @property
ajudará você a identificar todos os aspectos da propriedade a qualquer momento, sem verificar a implementação.
@Synthesize - Simplifica o trabalho se você precisar de uma propriedade simples sem qualquer trabalho complexo no Getter e Setter. Ele define uma implementação padrão de acordo com a definição de @property
.
Por fim, suas perguntas sobre string. As propriedades não ajudarão aqui se você estiver procurando por algo simples, digamos myObj.string += "abc"
. Não é o estilo C e com ou sem propriedade, você fará algo como myObj.string = [[myObj string] stringByAppendingString:@"abc"]
ou [[myObj string] appendString:@"abc"]
dependendo da natureza mutável/imutável do objeto String.
Como resultado final: é um grande tópico explicar tudo em um único post. Eu recomendo que você leia a documentação da Apple e talvez compre um livro sobre o Objective-C. Aaron Hillegass escreveu um - um bom começo para qualquer iniciante Objective -C e Mac OS X.