Recentemente, tentei compilar um projeto antigo do Xcode (que costumava compilar muito bem) e agora estou vendo muitos erros deste formulário:
error: writable atomic property 'someProperty' cannot pair a synthesized setter/getter with a user defined setter/getter
O padrão de código que causa esses erros sempre se parece com isso:
// Interface:
@property (retain) NSObject * someProperty;
// Implementation:
@synthesize someProperty; // to provide the getter
- (void)setSomeProperty:(NSObject *)newValue
{
//..
}
Eu posso ver por que o erro está sendo gerado. Eu digo ao compilador para sintetizar meus acessadores de propriedades (getter e setter) e, imediatamente depois, eu substituo o setter manualmente. Esse código sempre cheirava um pouco.
Então, qual é a maneira correta de fazer isso? Se eu usar em @dynamic
vez de @synthesize
, terei que escrever o getter também. Este é o único caminho?
atomic
propriedades? No caso de propriedades atômicas, pode ser uma boa idéia manter o par getter / setter sincronizado em relação à estratégia de bloqueio. Isso é difícil se uma parte é sintetizada enquanto a outra é um código personalizado.Respostas:
Eu tive o mesmo problema e depois de fazer um pouco de pesquisa, aqui está minha conclusão sobre esse problema:
O compilador avisa sobre um
@property
que você declarou como atômico (ou seja, omitindo anonatomic
palavra - chave), mas você fornece uma implementação incompleta de como sincronizar o acesso a essa propriedade.Para fazer esse aviso desaparecer:
Se você declarar
@property
a como atômico, siga um destes procedimentos:@dynamic
ou;@synthesize
e mantenha o setter e getter sintetizado ou;Se você declarar
@property
com(nonatomic)
, poderá combinar implementações manuais e sintetizadas de getters e setters.Atualização: uma observação sobre a síntese automática de propriedades
A partir do LLVM 4.0, o CLang fornece auto-síntese para propriedades declaradas que não são
@dynamic
. Por padrão, mesmo se você deixar de fora@synthesize
, o compilador fornecerá métodos getter e setter para você. No entanto, a regra para propriedades atômicas ainda é o mesmo: Deixe o compilador fornecer tanto o getter e setter, ou implementar-los tanto a si mesmo!fonte
Você precisa implementar o getter também. Exemplo:
fonte
Esta pergunta, entre os outros principais hits que você obtém ao pesquisar "propriedade customizada do objetivo C", não é atualizada com informações sobre "setter =" ou "getter =".
Portanto, para fornecer mais informações sobre esta questão:
Você pode fornecer a chamada @property com seu próprio método escrevendo
Observe os dois pontos do método de incubação fornecido.
Referência à documentação da Apple
EDIT: Não tenho muita certeza de como as novas alterações nas propriedades do Objective-C (agora são muito mais inteligentes) alteram as respostas a esta pergunta. Talvez tudo deva estar marcado como desatualizado.
fonte
Para outras pessoas que estão recebendo esse erro não pelo motivo descrito pelo OP, você provavelmente tem o mesmo problema que eu:
Você tem uma propriedade @ com o mesmo nome que um método - ().
Algo assim:
fonte