@synthesize name = _name;
2016-04-20 17:51
381 查看
下午突然碰到一个问题:
Class.h
Class.m
在一个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的。
到此,我算终于理解了为什么别人的代码都是这样写的~
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
到此,我算终于理解了为什么别人的代码都是这样写的~
相关文章推荐
- 对kali的若干升级问题解决方法
- IE6 select穿透问题(div 定位无法遮盖select)!
- 操作系统开发系列—12.d.扩充内核 ●
- office与pdf之间的相互转换
- spring MVC配置详解
- Delphi 中 函数参数中的 const 修饰符的本质以及注意事项
- 软件需求说明书
- CodeForces 660D
- Red Hat Enterprise Linux 4
- 几个实用的例子——Cookie读写详解
- 如何把jar包发布到maven私服
- Android初试--Android中的文件操作之SDcard操作(2)
- 如何处理 Permission denied: user=root, access=WRITE, inode="/user" 这类Hadoop权限问题问题
- Android开发中,那些让你相见恨晚的方法、类或接口
- nginx request
- 如何启动/停止/重启MySQL
- MySQL学习笔记—触发程序
- c++11 正则表达式 替换匹配子串
- Oracle Minus
- c指针数组与数组指针与指针函数与函数指针笔记