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

iOS编译问题:Property's synthesized getter follows Cocoa naming convention for returning 'owned'

2016-12-21 18:59 513 查看
原文链接:http://www.tuicool.com/articles/UrUbY3J

该文章提供了角度比较全面的答案!!!

在项目中定义了以new开头的textField,结果报错:

先看我的源码:
#import <UIKit/UIKit.h>

@interface ResetPasswordViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *phoneTextField;
@property (weak, nonatomic) IBOutlet UITextField *oldPasswordTextField;
<span style="color:#FF0000;">@property (weak, nonatomic) IBOutlet UITextField *newPasswordTextField;</span>
@property (weak, nonatomic) IBOutlet UITextField *confirmPasswordTextField;
@property (weak, nonatomic) IBOutlet UINavigationItem *navigationItem;

@end


解决办法: 

最简单的方法是改我们定义属性的名字,不要以new、copy、alloc等关键词开头!!!

点击打开链接

y guess is that the compiler version you’re using follows the
memory management rules for declared properties, too — more specifically, for declared properties’ accessors:

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.v
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios开发
相关文章推荐