我的猜测是,您使用的编译器版本也遵循声明属性的内存管理规则——更具体地说,对于声明属性的访问器:
如果您使用名称以“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 发布了Transitioning to ARC Release Notes,其中声明:
您不能为属性指定以new
or开头的名称copy
。
他们已经被告知他们的陈述不太准确:罪魁祸首是 getter 方法名称,而不是属性名称。
2015 年 1 月 17 日编辑:我刚刚注意到最近对 Clang 的提交建议上面的选项 3(使用objc_method_family(none)
),包括修复它,用于属性名称与特殊方法系列前缀之一匹配的一般情况。Xcode 很可能最终会合并此更改。