Pergunta

(Só para que você agora, eu estou aprendendo a desenvolver para o iPhone com um livro fui chamado Começando iPhone Desenvolvimento 3: Explorando o SDK, e eu não usar o construtor Interface) Há sempre uma razão para usar o getter na mesma classe, quando um membro privado é visível? Como em foo.h, tendo

NSObject *myObj;
...
@property (nonatomic, retain)NSObject *myObj;

e, em seguida, em Foo.m, acessando o membro myObj usando self.myObj (ou [auto myObj])? Porque no meu livro, Aqui está o que ele diz-lhe para escrever em um dos aplicativos (a sua verificação, se vista de um membro do UIViewController está no superview):

if(self.yellowViewController.view.superview == nil) {

(aviso do auto .yellowViewController ...) Existe realmente uma razão para isso? Se não há uma ideia que eu tenho é talvez porque o membro blueViewController é de classe BlueViewController, então eu acho que se não há nenhuma razão pode ser para não causar confusão. Então, há qualquer momento, onde usando o getter na mesma classe é necessário?

Graças !!

Foi útil?

Solução

Sim, acessando seus ivars através de um getter que diretamente é uma boa coisa a fazer.

Como um exemplo:. Um dos padrões normais de design em Cocoa (especialmente no telefone, onde os recursos são muito limitados) é chamado carregamento lento

somados, isso significa não carregar um recurso até que você precisar.

Idealmente, você iria querer colocar código em sua getter que iria verificar para ver se o recurso que está sendo solicitado é carregado, e se não, carregá-lo. Acessando o ivar directamente seria apenas retornar nulo. A alternativa seria para inicializar todos os ivars quando a sua classe pai é init'ed, assim potencialmente desperdiçando recursos para armazenar dados que podem ou não podem ser necessários.

Isso também permite que você potencialmente recursos lugar que poderiam ser recuperados novamente em seus métodos applicationDidReceiveMemoryWarning: e despejá-los quando os recursos ficou apertado, porque eles serão carregados novamente na demanda quando necessário.

Outras dicas

preguiçoso carregamento getter:

- (UIImageView*) getImageView
{
    if (!imageView)
    {
        imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"blah.png"]]; // just an example
    }
    return imageView;
}

Dependendo de como imageView é definido (copiar, transferir, reter) você precisará modificar a atribuição real, mas isso é o que se entende por carregamento lento.

Algumas razões para usar a sintaxe self.ivar getter em vez de acessar diretamente a variável de instância:

  • propriedades carregamento lento, como outros já referiram
  • As subclasses pode querer substituir a propriedade e tem o respeito superclasse que
  • Se você usar propriedades atômicas, a única maneira correta de acessar a propriedade é através do getter
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top