如何解决语义问题:财产的合成吸气剂遵循可可命名约定来返回“拥有的”物体
| 我目前正在使用iOS 5 SDK尝试开发我的应用。 我正在尝试将Nsstring设置为属性,然后将其合成到.m文件中(我之前没有做任何事情)。现在,我遇到了这个问题:“语义问题:Property的综合getter遵循可可命名约定,用于返回\'own \'对象。\“ 这是我的代码: 。H@interface ViewController : UIViewController {
Nsstring *newTitle;
}
@property (strong,nonatomic) Nsstring *newTitle;
.m
@synthesize newTitle;
有人知道我该如何解决吗?
谢谢!!
解决方法
我的猜测是,您使用的编译器版本也遵循声明属性的内存管理规则,尤其是声明属性的访问器:
如果使用名称以“ alloc”,“ new”,“ copy”或“ mutableCopy”开头的方法创建对象,则您拥有该对象的所有权。
合成为named2ѭ的属性时,会产生一个名为
-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做出的一项承诺,建议在属性名称与特殊方法族前缀之一匹配的一般情况下,建议上面的选项3(使用objc_method_family(none)
),包括修复程序。 Xcode最终可能会合并此更改。
, 不可接受的对象名称
newButton
copyLabel
allocTitle
可接受的对象名称
neueButton
mCopyLabel
_allocTitle
#arc#自动合成的#xcode-4.6.1
**编辑**
显然您也不能使用mutableCopy。
, 以new开头的成员的名称将触发警告。将名称更改为editedTitle,警告将消失。我找不到可以证实这一点的文档,但是通过测试,可以确定以'new'开头的成员变量会加剧编译器。
, ARC不允许在属性名称中使用\“ New .... \”。但是您可以通过更改getter名称来使用\“ newTitle \”。
@property (nonatomic,strong,getter=theNewTitle) NSString *newTitle;
, 看起来Bavarious所暗示的并不是您想要做的。您要做的就是声明一个实例变量NewTitle
,然后合成该属性。我们曾经不得不声明实例变量和属性。不再。
现在,我相信正确的方法如下:
。H
@interface ViewController : UIViewController
@property (nonatomic,strong) NSString *newTitle;
.m
@synthesize newTitle = _newTitle; // Use instance variable _newTitle for storage
合成属性“ 2”的实例变量。您不希望实例变量与属性相同-太容易出错。
请参见示例:声明属性和合成访问器
, 在CoreData中,如果您在属性中使用\“ new ... \”(正常编译),它将随机崩溃,并带有\“ bad access \”异常。
没有崩溃日志,带有“所有例外断点”的行将完全没有帮助。
, 手动编写与属性名称相同的setter可以消除此警告。
,除了您应该/不能在属性名称前使用“ new”的问题之外,再说一件事:尽量避免在名称前使用“ new”。 \“新\”取决于时间。目前,它对您来说是新的,但是一段时间后,您可能想再次实现一些新功能。因此,在名称中使用\“ new \”总是不好的。尝试这样思考:在编程世界中,“ new”总是创建某种东西:某事物的新实例。
在您的情况下,当您要分配其他标题时,则将当前名称分配给属性titleReplacement。
还有一件事:尝试首先用动词命名函数和方法,例如setSomething或getSomething。
但是在属性中,请尝试首先命名对象,例如heightMinimum,heightMaximum等。->在编码时使用检查器时,总是会寻找对象。试试看。 ;-)
, NS_RETURNS_NOT_RETAINED
用于解决命名问题。
@property (nonatomic,copy) NSString *newTitle NS_RETURNS_NOT_RETAINED;
我们可以找到其定义如下
#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
\'ns_returns_not_retained \'属性是\'ns_returns_retained \'的补充。如果函数或方法似乎遵循Cocoa约定并返回保留的Cocoa对象,则此属性可用于指示返回的对象引用不应被视为返回给调用方的“拥有”引用。 Foundation框架定义了一个宏NS_RETURNS_NOT_RETAINED,该宏在功能上等效于以下所示的宏。
在此处附上更多详细信息。
, 尝试这个:-
@property (nonatomic,retain) NSString *newTitle;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。