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?

Foi útil?

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.

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