我们知道每当我们在oc类内声明一个私有的成员变量时,我们为了需要在类的外部进行相应的访问,就需要为每个
成员变量设置get/set方法,通过set方法为对应的变量设置值,get方法则可以获得该变量的值,传统的做法如下:
定义文件:
声明文件:
根据以上的代码我们可以看出,我们首先需要声明变量,然后在声明get/set方法,最后定义方法。这种做法有一定的好处,那就是我们可以
自定义在方法内的一些操作,但是如果有经验的话,就知道大多数情况下是不需要进行自定义操作的,那么问题就来了:就如我们可以看到的
一样,代码的重复率非常惊人,那么就意味着我们进行了大量的无用工作,那么有没有什么更好的办法呢?当然有,那就是本节我们要介绍的
两个关键字,property、synthesize,下面的代码就展示如何使用:
什么都不说,我们先看代码,是不是有很多读者会问:结果不是很正确吗?设置的什么,打印的结果就是什么,有什么好看的。毫无疑问,结果
肯定是不正确的,如果是正确的话,我也不会说,对不对?那好,接下来我们就看看问题出在了哪?不知道大家有没有注意到在打印结果的下一行
有一道下划线,下划线下面还有两行打印结果,这很明显使我们调用test方法打印的结果。我们先看第一行:分别是0和null。接下来是第二行:
分别是12和112,好像有点意思了,第二行和我们上面的打印结果一样。那我们就去test里面看看这一行打印的是不是_age和_str两个变量?
不看不知道,原来第一行0和null才是_age、_str的结果,而第二行是aeg、str的结果。那就更奇怪了,哪里来的age/str呀?好,看到这里我们
就该下结论了:@property后面声明的名字是什么,他就会去找什么,如果找不到就会创建一个同名的变量。就如本例,他就会去找age、str变量
,但我们只声明了_age/_str所以他就自动声明age、str两个变量,那么我们该如何解决这个问题呢?那就是在定义是如下:
@synthesize age = _age;
@synthesize str = _str;
在完成从上述的修改后,我们发现了下面的错误,这就意味着,age、str这两个变量不存在了,这正好验证的我们之前的结论:
(当property找不到同名变量时,就会自动生成同名变量)。
我们将上一节打印自动生成变量的代码注释掉:
结果正如我们所料。
接下来我们再来反思我们上面的过程:声明变量-->声明property-->定义synthesize。我们可以看出好像还是会有很多冗余的内容。同一个变量在
这三步中都有涉及,那么我们是不是可以一步解决呢?当然可以,看代码:
我们注释掉代码声明:
我们注释掉synthesize的定义
我们看到我们既没有声明变量、也没有实现synthesize只是声明了property。系统会为我们自动生成一个在最前面加了一个下划线的同名的变量,并
为我们自动完成了方法的定义,接下来就可以直接使用了,对比一下我们的1.0版本是不是简洁了好多好多了呢?幸福了不少
写在最后:正如一开始所讲,这种方法的确大大简化了我们的工作,但同样限制了功能,所以这种方法不要强求,根据需要灵活选择