定义位置

在ios开发中,一个类的成员变量定义的位置有4个地方

  • 1.在.h文件的interface块中定义(属性)
  • 2.在.m文件的匿名分类中定义(属性)
  • 3.在.m文件的匿名分类中用{}包裹起来进行定义
  • 4.在.m文件的@implementation中用{}包裹起来进行定义

那么每个地方有什么区别呢?具体要怎么选择,我简单的分析一下

第一种方法大家都很常用,也是四种方式中唯一一个是在.h文件中定义的,在这里定义的一个最主要的作用就是将类的成员变量暴露出来,也就是公共的属性,可以通过.语法直接访问,其余的三种方法都是私有变量,外部不可见

第二种方法定义的也是属性,必需用@proterty来修饰,与第一种方法的区别在于他是私有变量,也就是只有在类的内部才能访问

第三和第四种方式我没有发现具体的区别,理论上放在@implementation后面会好一些.这两种方式定义的变量不是属性,是内部私有变量,定义的时候也不允许用@property来修饰,所以也没有默认的getter和setter方法,都是直接值访问的.其实在新版本的xcode中你定义属性的时候,系统会默认为你定义好以_开头的同名内部变量

那么具体如何选择呢,个人总结了一下,遵循以下几点
1.如果是公共属性,要让外部类可以访问的话,那你没的选择了,只有第一种方法了
2.如果你的成员变量只是在类的内部使用,并且需要延时初始化这个属性,重写getter或setter方法的话那么选择第二种方式
3.如果你的成员变量只是在类的内部使用,并且不需要getter和setter方法时可以定义第三或第四个方法的位置上(建议第4个位置)

访问方式

前面提到在定义属性的时候,系统或默认为你定义好以_开头的同名内部变量,那么访问的时候有两种访问方式,self.xxx和_xxx,区别在与前一种方式会通过getter和setter方法访问,而后一种方法是直接访问xxx的值.具体哪种方式比较好暂时没有比较有说服力的说服,凭大家高兴,不过有几点需要注意的地方
1.如果有重写getter或setter方法那么尽量用self.xxx的方法
2.在init或者delloc中要用_xxx的方式
3.通过_xxx的方式访问的话不会触法kvo

原创文章,转载请注明出处,谢谢!