今天遇到一个错误,分享下:
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 thenone
method family as opposed to thenew
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
orcopy
.They’ve already been notified that their statement is not quite accurate: the culprit is the getter method name, not the property name.