我目前正在使用 iOS 5 SDK 尝试开发我的应用程序。我正在尝试使 NSString 成为属性,然后在 .m 文件中合成它(我之前已经这样做了,没有任何问题)。现在,我遇到了这个问题:“语义问题:属性的合成 getter 遵循 Cocoa 命名约定以返回‘拥有’对象。”
这是我的代码:.h
@interface ViewController : UIViewController { NSString *newTitle; } @property (strong, nonatomic) NSString *newTitle;
.m
@synthesize newTitle;
有谁知道我该如何解决这个问题?谢谢!!
我的猜测是,您使用的编译器版本遵循声明属性的内存管理规则,更具体地说,对于声明的属性访问器:
如果您使用名称以“渥lloc”、“渘ew”、“opy”或“utableCopy”开头的方法创建对象,则您拥有该对象的所有权。
一个名为 的属性newTitle在合成时会产生一个名为 的方法-newTitle,因此会产生警告/错误。-newTitle应该是该newTitle属性的 getter 方法,但是命名约定规定名称以开头的方法new返回一个对象,该对象由调用者拥有,而 getter 方法不是这种情况。
newTitle
-newTitle
new
您可以通过以下方式解决此问题:
重命名该属性:
@property (strong, nonatomic) NSString *theNewTitle;
保留属性名称并指定不以特殊方法名称前缀之一开头的 getter 名称:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
保留属性名称和 getter 名称,并告诉编译器,即使 getter 名称以 开头new,它也属于none方法族而不是new方法族:
none
#ifndef __has_attribute
@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,其中声明:
您不能为属性指定以newor开头的名称copy。
copy
他们已经被告知他们的陈述不太准确:罪魁祸首是 getter 方法名称,而不是属性名称。
编辑 2015 年 1 月 17 日: 我刚刚注意到最近对 Clang 的提交建议上面的选项 3(使用objc_method_family(none)),包括修复它,用于属性名称与特殊方法系列前缀之一匹配的一般情况。Xcode 很可能最终会合并此更改。
objc_method_family(none)