您的位置:首页 > 其它

@synthesize name = _name;

2016-04-20 17:51 381 查看
下午突然碰到一个问题:

Class.h

@interface Class : NSObject

@property (nonatomic, copy) NSString *name;

@end


Class.m

@implementation Class

- (NSString *)name {
return _name;
}

- (void)setName:(NSString *)name {
_name = @"zhangsan";
}

@end




在一个Class中,有一个property叫name,同时重写setter和getter,并且在setter/getter里边访问_name成员变量,Xcode会报错:

“Use of undeclared identifier ‘_name’”,明明声明了property,为什么呢?

原来,同时重写setter和getter时,编译器不在默认生成名为_property的私有成员变量。如果非要访问,加上@synthesize试试吧~

那么@synthesize干了啥?

1:自动生成property的setter和getter声明

2:自动实现property的setter和getter

3:默认生成名为_property的私有成员变量,如_name(Xcode4.4之后不在需要@synthesize,Xcode会默认生成);

使用@synthesize name = _name;

意味着,该类默认实现了accessor,但是在accessor里,默认访问的是名为_name的成员变量,也就是说accessor操作的是_name。

关于私有:

上边提到_name是私有变量,其实也不难理解,因为变量的声明出现在.m文件啊~ 哈哈~

子类可以访问通过self.name访问name属性,但是却不能直接通过_name访问成员变量,如果你现在子类也访问_name,那就在Class里添加名为_name的成员变量吧~因为成员变量访问权限默认protected的。

@interface Class : NSObject{
NSString *_name;
}

@property (nonatomic, copy) NSString *name;

@end


到此,我算终于理解了为什么别人的代码都是这样写的~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: