在项目中定义了以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:


  1. Renaming that property:
    ​@property (strong, nonatomic) NSString *theNewTitle;​
  2. 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;​
  3. 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.