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:
Você assume a propriedade de um objeto se o criar usando um método cujo nome comece por "alocar", "novo", "copiar" ou "mutableCopy".
Uma propriedade chamada newTitle
, quando sintetizada, gera um método chamado -newTitle
, daí o aviso / erro. -newTitle
deve ser um método getter para a newTitle
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:
@property (strong, nonatomic) NSString *theNewTitle;
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:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
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:
#ifndef __has_attribute
#define __has_attribute(x) 0 // Compatibility with non-clang compilers
#endif
#if __has_attribute(objc_method_family)
#define BV_OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
#else
#define BV_OBJC_METHOD_FAMILY_NONE
#endif
@interface ViewController : UIViewController
@property (strong, nonatomic) NSString *newTitle;
- (NSString *)newTitle BV_OBJC_METHOD_FAMILY_NONE;
@end
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:
Você não pode dar um nome a uma propriedade que comece com new
ou copy
.
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.