Pergunta

Quando eu tentei compilar meu aplicativo para OS 3 I encontrou um o seguinte erro:

erro: tipo de acessor não coincide com o tipo de propriedade

O erro foi para uma propriedade Tentei acesso que é definido da seguinte forma:

NSMutableArray *myArray

@property (readonly,nonatomic) NSArray* myArray;

a propriedade é @synthesized no arquivo de implementação.

Isso funcionou muito bem no OS 2.2.1, mas não é OS 3.0

Escrevendo o método getter me resolveu o problema.

Alguém tem conhecimento de mudanças para Objective-C entre OS 2.2.1 e 3.0? Existe alguma documentação para essas mudanças?

O API alterações do documento não parece conter nada sobre esta questão.

Editar

o erro ocorre quando você tentar acessar a propriedade por exemplo

NSArray *anArray = myClass.myArray;

Como eu mencionei acima eu encontrei uma solução para este: escrever o método getter-me, no entanto o que eu sou realmente depois é algum tipo de documentação da Apple explicar essa mudança e quaisquer outras alterações que não são API relacionados

Obrigado por sua ajuda

Foi útil?

Solução

Este é um erro do compilador.

Embora você não especificá-lo completamente, espero que a sua aparência código como este:

@interface Foo : NSObject {
    NSMutableArray *objects;
}
@property (readonly, copy) NSArray *objects;
@end

@implementation Foo
@synthesize objects;
@end

O compilador é, infelizmente, confuso entre a declaração do objects propriedade e a declaração do objects variável de instância . Lembre-se que as propriedades e variáveis ??de instância são coisas diferentes em Objective-C; uma propriedade pode ser apoiado por uma variável de instância, mas é realmente parte da interface pública de uma classe.

Você pode contornar isso alterando o código para separar claramente a definição da variável de instância da definição da propriedade, por exemplo, por prefixar o nome da variável de instância:

@interface Foo : NSObject {
    NSMutableArray *_objects;
}
@property (readonly, copy) NSArray *objects;
@end

@implementation Foo
@synthesize objects = _objects;
@end

Desta forma, o compilador não se confundem sobre a propriedade versus a variável de instância em expressões como self.objects (o que não deve de qualquer maneira, mas, aparentemente, faz).

Apenas a cabeça fora a resposta inevitável: Apple não reservar o prefixo underbar para variáveis ??de instância. É reservado para os métodos. Independentemente disso, se você não gosta da barra inferior, sinta-se livre para usar outro prefixo.

Outras dicas

Editar: resposta Original removido após revisão por pares que falta. Por favor, leia os comentários de Chris Hanson sobre o assunto. Eu estou deixando o resto aqui porque eu acho que ainda é válido.


Note que, mesmo se você declarar o tipo de propriedade a ser NSArray, o objeto retornado ainda é uma NSMutableArray e os métodos mutáveis ?? são definidos para ele. Declarando a propriedade desta forma faz não impedir que alguém acidentalmente mutação do array.

Se você quiser ter certeza de que a matriz retornada não é mutável, você poderia declarar o imóvel como no seu exemplo original, e depois rolar o seu próprio assessor:

- (NSArray *)myArray { return [NSArray arrayWithArray:myArray]; }

Note que isso iria retornar um NSArray não retida. Seria até a chamada para assumir a propriedade do objeto se ele precisava para persistir.

Você está vendo erros porque XCode está agora a emissão de avisos e erros para as coisas que anteriormente não ...

Eu diria que ele deve ser, no máximo, um aviso para fazer o que você está fazendo, eu entendo a sua tentativa de apresentar a matriz como imutável para o mundo exterior, mas tê-lo mutável dentro da classe. Você pode querer considerar um acessor diferente, com um nome diferente, construída para retornar a matriz mutável especificamente.

É ainda objectivo C-2,0; o compilador é apenas talvez um pouco atualizado com considerando este tipo de tipo de mudança de um erro. É muito bonito deve ser um erro. Pelo menos deveria avisá-lo que você provavelmente não quer dizer que você escreveu. Então você poderia lançar coisas para torná-lo não avisá-lo, o que você não pode fazer com a declaração @synthesize.

Eu exatamente colou seu código e uma declaração de sintetizar em meu controlador e eu tenho nenhum erro ou aviso sobre isso. É construído bem. Agora eu definir o SDK de base para "Simulator 3.0", e que a compilação "Simulator 3.0 depuração". Este projecto começou no 2.2.1 SDK e eu acabou de instalar o SDK 3.0 ontem; Xcode é a versão 3.1.3.

Atualizar :. Oh, vejo que realmente tentando definir a propriedade é onde você começa o erro que você mencionou

    self.myArray = [NSArray arrayWithObject:@"foo"];

É claro que você não pode @synthesize este comportamento e deve escrever seus próprios assessores.

- (NSArray*)myArray {
    return [NSArray arrayWithArray:myArray];
}
- (void)setMyArray:(NSArray*) pMyArray {
    myArray = [NSMutableArray arrayWithArray:pMyArray];
}

O preenchimento desses assessores, não fazer a mensagem desaparecer, então eu tive que mudar o acesso a:

    [self setMyArray:[NSArray arrayWithObject:@"foo"]];

Usando a sintaxe acima, sem assessores personalizados também não trabalho.

PS Uau, é ninguém mais irritado que você não pode nem copiar bolhas mensagem ou o texto na janela de resultados da construção?

Portanto, esta é realmente a ver com a chamada @synthesize que não está feliz com expondo uma NSMutableArray como um NSArray -. Porque não basta implementar a getMethod

Na verdade pensar nisso ele deve ser o método conjunto que não é feliz -. Você não seria capaz de definir um NSArray em um NSMutableArray

As suas perguntas eram:

Alguém tem conhecimento de mudanças para Objective-C entre OS 2.2.1 e 3.0?

Existe alguma documentação para essas mudanças?

As respostas definitivas são:

1) Não houve mudanças intencionais para a especificação da linguagem, mas o compilador e outras ferramentas de desenvolvimento alterado. Chris e seus colegas de trabalho são os especialistas sobre essas mudanças.

2) Provavelmente não, porque todas as alterações foram intencionais ou feito para um melhor comportamento jogo com a documentação.

Você não deve ser tão rápido para demitir resposta Chris' como 'um palpite.' Chris trabalha em ferramentas de desenvolvimento da Apple. Você pode obter uma outra resposta que você gosta mais, mas você não vai ter uma resposta mais especialista.

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