您的位置:首页 > 移动开发 > IOS开发

iOS开发 error: property's synthesized getter follows Cocoa naming convention for returning 'owned' obj

2014-10-26 22:57 417 查看
今天遇到一个错误,分享下:
error: property's synthesized getter follows Cocoa naming convention for returning 'owned' objects

简单说错误是因为命名不规范的原因,命名不能以new,copy等开头。

在stackoverflow看到的是这样说的

You take ownership of an object if
you create it using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy”.

A property named 
newTitle
,
when synthesised, yields a method called 
-newTitle
,
hence the warning/error. 
-newTitle
 is
supposed to be a getter method for the 
newTitle
 property,
however naming conventions state that a method whose name begins with 
new
 returns
an object that’s owned by the caller, which is not the case of getter methods.

You can solve this by:

Renaming that property:
@property (strong, nonatomic) NSString *theNewTitle;


Keeping the property name and specifying a getter name that doesn’t begin with one of the special method name prefixes:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;


Keeping both the property name and the getter name, and telling the compiler that, even though the getter name starts with 
new
,
it belongs to the 
none
 method
family as opposed to the 
new
 method
family:
#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


Note that even though this solution allows you to keep 
newTitle
 as
both the property name and the getter name, having a method called 
-newTitle
 that
doesn’t return an object owned by the caller can be confusing for other people reading your code.

For the record, Apple have published Transitioning
to ARC Release Notes, in which they state:

You cannot give a property a name that begins with 
new
 or 
copy
.

They’ve already been notified that their statement is not quite accurate: the culprit is the getter method name, not the property name.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐