Atualmente, estou usando o iOS 5 SDK tentando desenvolver meu aplicativo. Estou tentando criar uma propriedade NSString e sintetizá-la no arquivo .m (já fiz isso antes sem problemas). Agora, me deparei com isso: "Problema semântico: o getter sintetizado da propriedade segue a convenção de nomenclatura do cacau para o retorno de objetos 'de propriedade'".
Este é o meu código: .h
@interface ViewController : UIViewController {
NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;
.m
@synthesize newTitle;
Alguém tem uma idéia de como eu poderia resolver isso? Obrigado!!
Respostas:
Meu palpite é que a versão do compilador que você está usando segue também as regras de gerenciamento de memória para propriedades declaradas - mais especificamente, para acessadores de propriedades declaradas:
Uma propriedade chamada
newTitle
, quando sintetizada, gera um método chamado-newTitle
, daí o aviso / erro.-newTitle
deve ser um método getter para anewTitle
propriedade, no entanto, as convenções de nomenclatura afirmam que um método cujo nome começa comnew
retorna um objeto que pertence ao chamador, o que não é o caso dos métodos getter.Você pode resolver isso:
Renomeando essa propriedade:
Mantendo o nome da propriedade e especificando um nome de getter que não comece com um dos prefixos de nome de método especial:
Mantendo o nome da propriedade e o nome do getter e informando ao compilador que, mesmo que o nome do getter comece com
new
, ele pertence aonone
família de métodos, e não ànew
família de métodos:Observe que, embora esta solução permita que você mantenha
newTitle
o nome da propriedade e o nome do getter, ter um método chamado-newTitle
que não retorna um objeto de propriedade do chamador pode ser confuso para outras pessoas que leem seu código.Para o registro, a Apple publicou Transição para o ARC Release Notes , na qual afirmam:
Eles já foram notificados de que sua declaração não é muito precisa: o culpado é o nome do método getter, não o nome da propriedade.
Edit 17 Jan 2015: Acabei de notar uma confirmação recente para Clang que sugere a opção 3 acima (usando
objc_method_family(none)
), incluindo uma correção, para o caso geral em que um nome de propriedade corresponde a um dos prefixos especiais da família de métodos. O Xcode provavelmente incorporará essa alteração eventualmente.fonte
NS_RETURNS_NOT_RETAINED
é o que você precisa também.Nomes de objetos inaceitáveis
Nomes de objetos aceitáveis
#arc # sintetizado automaticamente # xcode-4.6.1
** EDIT **
Aparentemente, você também não pode usar o mutableCopy .
fonte
O nome do membro que começa com new é o que aciona o aviso. Altere o nome para EditedTitle e o aviso desaparecerá. Não consegui encontrar documentação confirmando isso, mas, através do teste, foi possível determinar que as variáveis de membro que começam com 'new' agravam o compilador.
fonte
O ARC não permite usar "Novo ...." no nome da propriedade. mas você pode usar "newTitle" alterando o nome do getter.
fonte
Não parece o que Bavarious estava sugerindo era o que você queria fazer. Tudo o que você quer fazer é declarar uma variável de instância
NewTitle
e sintetizar a propriedade Costumávamos declarar a variável e a propriedade da instância. Não mais.Agora, acredito que o caminho certo para fazer isso é o seguinte:
.h
.m
A variável de instância para a propriedade
newTitle
é sintetizada. Você não deseja que sua variável de instância seja igual à sua propriedade - é muito fácil cometer erros .Consulte o Exemplo: Declarando propriedades e sintetizando acessadores
fonte
NS_RETURNS_NOT_RETAINED
é o que você precisa.No CoreData, se você usar "novo ..." no atributo (compilar normalmente), ele trava aleatoriamente com uma exceção de "acesso incorreto".
Não há registro de falha e a linha mostrada com o "Ponto de interrupção de todas as exceções" não ajudará em nada.
fonte
Escrever um setter manualmente com o nome igual ao da propriedade removeu esse aviso.
fonte
Além da questão de que você deve / não pode usar "new" na frente de seus nomes de propriedade, digamos mais uma coisa: tente evitar "new" na frente de nomes em geral. "Novo" depende do tempo. Atualmente, é novo para você, mas algum tempo depois você talvez queira implementar algo novo novamente. Portanto, usar "novo" em nomes é sempre ruim. Tente pensar assim: no mundo da programação, "novo" está sempre criando algo: uma nova instância de algo.
No seu caso, quando você deseja atribuir um título diferente, em seguida, o nome atual, sua propriedade titleReplacement.
Mais uma coisa: tente nomear funções e métodos com o verbo primeiro, como setSomething ou getSomething. Porém, nas propriedades, tente nomear o objeto primeiro, como heightMinimum, heightMaximum, etc. -> quando você usa o inspetor durante a codificação, sempre procura objetos. Experimente. ;-)
fonte
NS_RETURNS_NOT_RETAINED
é usado para resolver o problema de nomeação.Podemos encontrar sua definição da seguinte maneira:
Anexe mais detalhes aqui.
fonte
tente o seguinte: -
fonte