OC中类的成员变量默认是@protect,外界无法访问类的成员变量,所以通常我们在类文件中声明变量时会同时声明setter跟getter两个方法方便我们获取变量和修改(下面所有代码均在ARC模式下实现)
Person.h文件
- #import <Foundation/Foundation.h>
- @interface Person : NSObject
- {
- int _age;
- NSString * _name;
- }
- - (void)setAge: (int)age; //setter方法
- - (int)age; //getter方法
- - (void)setName: (NSString *)name;
- @end
- #import "Person.h"
- @implementation Person
- - (void)setAge: (int)age
- {
- _age = age;
- }
- - (int)age
- {
- return _age;
- }
- - (void)setName: (NSString *)name
- {
- _name = name;
- }
- @end
![](https://i-blog.csdnimg.cn/blog_migrate/3e85809cfe81f23a85e3a3fdd0d0a31b.png)
在创建了setter方法跟getter方法之后,我们可以在main函数中访问到Person中的_age变量,也可以对age进行修改。而name变量我们只给它创建了setter方法,然后在访问变量时报错了。
为了进一步证明▪语法确实调用了这些方法,我在age的两个方法里加上断点,然后运行测试
![](https://i-blog.csdnimg.cn/blog_migrate/2fe54f068d65976fc26167d60e7d18b5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8d85dc236e2d94f4f74625b0947f083a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/32d39dfeb7ff28dc2411bc609832a3e5.png)
这说明了点语法实际上在我们使用时并不是直接访问变量,而是使用getter跟setter的方法来进行成员变量的访问和修改。那么为了说明属性@property的特性,我们将Person.m文件中的setter和getter方法全部清除掉,重写Person.h
- #import <Foundation/Foundation.h>
- @interface Person : NSObject
- @property (assign, nonatomic) int age;
- @property (copy, nonatomic) NSString * name;
- @end
- #import "Person.h"
- @end
修改完后我们直接运行main.m的原先代码,输出
![](https://i-blog.csdnimg.cn/blog_migrate/041e83c174d1f115130ab5d84d526334.png)
要知道我们在新的Person文件里没有创建任何getter跟setter方法,但是我们可以直接使用这两个成员变量了,这是因为我们使用@property的时候编译器会自动帮我们生成getter和setter方法。当然了,我们可以在.m文件中使用关键字@dynamic加上变量名告诉编译器不要为这些变量自动生成这些方法
![](https://i-blog.csdnimg.cn/blog_migrate/d6413e7e850b28cb8a12df391622ea8e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f29d9e3e5ba282351680c2b1b5a8336c.png)