我的猜测是,您使用的编译器版本也遵循声明属性的内存管理规则 -更具体地说,声明属性的访问器:
如果使用名称以“ alloc”,“ new”,“ copy”或“ mutableCopy”开头的方法创建对象,则将拥有该对象的所有权。
名为的属性newTitle
在综合后会产生称为的方法-newTitle
,因此产生警告/错误。-newTitle
本来应该是该newTitle
属性的getter方法,但是命名约定规定,以其名称开头的方法会new
返回调用者拥有的对象,而getter方法并非如此。
您可以通过以下方法解决此问题:
重命名该属性:
@property (strong, nonatomic) NSString *theNewTitle;
保留属性名称并指定一个不以特殊方法名称前缀之一开头的getter名称:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
保留属性名称和getter名称,并告诉编译器,即使getter名称以开头new
,它也属于none
方法族,而不是new
方法族:
#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
请注意,即使此解决方案允许您同时保留newTitle
属性名称和getter名称,但使用一个-newTitle
不返回调用方拥有的对象的方法可能会使其他人混淆您的代码。
作为记录,Apple已发布《过渡到ARC发行说明》,其中指出:
您不能给属性以new
或开头的名称copy
。
他们已经被告知他们的声明不够准确:罪魁祸首是吸气剂方法名称,而不是属性名称。
2015年1月17日,编辑:我刚刚注意到最近对Clang所做的一项承诺,建议objc_method_family(none)
在属性名称与特殊方法族前缀之一匹配的一般情况下(使用)对上述选项3(使用进行修复)。Xcode最终可能会合并此更改。