在.h或者.m文件中用@property声明一个属性时。如果同时重写getter和setter方法,会报“该变量没有定义的错误”。如:
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString * name;
- (NSString *)name;
- (void)setName:(NSString *)name;
@end
Person.m
#import "Person.h"
@implementation Person
- (NSString *)name
{
return _name;
// 编译器报错: Use of undeclared identifier '_name'
}
- (void)setName:(NSString *)name
{
_name = name;
}
@end
解决办法:.m文件中需要加上:
@synthesize name = _name;
修改之后的Person.m
#import "Person.h"
@implementation Person
@synthesize name = _name;
- (NSString *)name
{
return _name;
}
- (void)setName:(NSString *)name
{
_name = name;
}
@end
原因:因为@property
默认给该属性生成getter
和setter
方法,当getter
和setter
方法同时被重写时,则系统就不会自动生成getter
和setter
方法了,也不会自动帮你生成_name
变量,所以编译器会报“使用未定义的变量的错误”。
声明的
property
如果没有特意指定synthesize
的话,那么Objective-C
就会自动的给你声明一个“ _ ” 开头的实例变量。
_name
访问的是name
的地址。self.name
访问的是name
的getter
。这两者并不是完全等价的,self.name
是用objc_msgSend
发消息,_name
或者self->name
则是直接访问内存地址
网友评论