iOS中@Property声明的属性同时重写getter和setter方法报错问题

在.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默认给该属性生成gettersetter方法,当gettersetter方法同时被重写时,则系统就不会自动生成gettersetter方法了,也不会自动帮你生成_name变量,所以编译器会报“使用未定义的变量的错误”。

声明的property如果没有特意指定synthesize的话,那么Objective-C就会自动的给你声明一个“ _ ” 开头的实例变量。
_name访问的是name的地址。self.name访问的是namegetter。这两者并不是完全等价的,self.name是用objc_msgSend发消息,_name或者self->name则是直接访问内存地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容